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 testimport 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öntem | Ne 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 |
|---|---|
view | Son 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 |
storage | Deponun şu anki hali |
requests | Adanotch'a yapılan istekler: { method, params } |
notifications, activities | notify.island ve island.show çağrıları |
logs, errors | Console satırları ve olay/zamanlayıcıdaki hatalar |
opened, clipboard | open() 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.