Ada Eklentileri
Rehberler

Test

Eklentini Node'da, Adanotch'un kendi runtime'ıyla, Mac'e dokunmadan test et.

adanotch init şablonu bir test kiti içerir: adanotch/testing.js. Eklentini esbuild ile paketler ve Adanotch'un içinde çalışan aynı runtime ile Node'da çalıştırır. Adanotch'un vereceği cevapları (sistem verisi, fetch, medya…) sen verirsin.

npm test
test/index.test.ts
import assert from "node:assert/strict";
import { test } from "node:test";
import { loadExtension } from "../adanotch/testing.js";

test("CPU çentiğin yanında görünür", async () => {
  const ext = await loadExtension({
    mocks: { "system.stats": () => ({ cpuPercent: 42, ramPercent: 50, usedMemoryGB: 8, totalMemoryGB: 16 }) },
  });
  assert.equal(ext.view.compact?.trailing?.value, "42%");
});

loadExtension eklentiyi başlatır, setup ve ilk update'in bitmesini bekler. Bunlardan biri hata fırlatırsa reddeder.

Seçenekler

Alan

Tür

Eklentiyi sürmek

YöntemNe yapar
update()update'i çalıştırır
action(name, value?)onAction, ardından update
setSettings(values)onSettingsChange, ardından update
emit(event, payload?)Bir olayı gönderir; eklenti dinlemiyorsa hata verir
command(name, data?)adanotch ext <id> <name> [data] gibi
advance(ms)Sahte saati ilerletir; vadesi gelen zamanlayıcılar çalışır
settle()Bekleyen promise'lerin, isteklerin ve render'ların bitmesini bekler
stop()Durdurur

Sonucu okumak

Özellikİçerik
viewSon görünüm: { compact, expanded }
texts(node?)Görünümdeki tüm metinler
find(type, where?)İlk eşleşen düğüm, yoksa null
storageDeponun şu anki hali
requestsAdanotch'a yapılan istekler: { method, params }
notifications, activitiesnotify.island ve island.show çağrıları
logs, errorsConsole satırları ve olay/zamanlayıcıdaki hatalar
opened, clipboardopen() ile açılanlar, panonun son hali

Örnekler

fetch

test("sıcaklığı gösterir", async () => {
  const ext = await loadExtension({
    settings: { city: "Ankara" },
    mocks: {
      fetch: (req) => {
        assert.match(req.url, /api\.open-meteo\.com/);
        return { body: { current: { temperature_2m: 18.4 } } };
      },
    },
  });
  assert.ok(ext.texts().includes("18°"));
});

test("ağ hatasında son değeri gösterir", async () => {
  const ext = await loadExtension({
    storage: { last: { temp: 21 } },
    mocks: {
      fetch: () => {
        const error = new Error("offline");
        error.name = "NetworkError";
        throw error;
      },
    },
  });
  assert.ok(ext.texts().includes("21°"));
});

Bir mock hata fırlattığında hatanın name'i eklentinin gördüğü sınıfı seçer: NetworkError, TimeoutError, PermissionError.

Zamanlayıcılar

test("25 dakika sonra bildirim gösterir", async () => {
  const ext = await loadExtension();
  await ext.action("start");
  await ext.advance(25 * 60_000);
  assert.equal(ext.notifications.at(-1)?.text, "Mola zamanı");
});

Olaylar ve izinler

test("şarkı değişince başlık güncellenir", async () => {
  let track = { title: "A", artist: "X", album: "", duration: 200, elapsed: 0, isPlaying: true, app: "com.spotify.client" };
  const ext = await loadExtension({ mocks: { "media.nowPlaying": () => track } });
  track = { ...track, title: "B" };
  await ext.emit("media.change", track);
  await ext.settle();
  assert.ok(ext.texts().includes("B"));
});

test("medya izni yoksa açıklama gösterir", async () => {
  const ext = await loadExtension({ permissions: [] });
  assert.ok(ext.texts().includes("Medya izni kapalı"));
});

Hata satırları

Testlerdeki hata yığınları da kaynak haritasıyla src/index.ts:12:5 biçiminde gösterilir.

Bu sayfada