Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ode",
"version": "0.1.35",
"version": "0.1.36",
"description": "Coding anywhere with your coding agents connected",
"module": "packages/core/index.ts",
"type": "module",
Expand Down
29 changes: 8 additions & 21 deletions packages/config/local/pr-trackers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import type { GitHubRepo } from "@/utils/git-remote";
import {
clearPrTrackersForTests,
closePrTrackerDatabaseForTests,
DEFAULT_PR_AGENT_PROVIDER,
DEFAULT_PR_POLL_INTERVAL_SEC,
DEFAULT_PR_PROMPT_TEMPLATE,
deletePrTracker,
Expand Down Expand Up @@ -111,32 +110,23 @@ describe("pr-trackers settings", () => {
test("returns defaults on first access", () => {
const settings = getPrTrackerSettings();
expect(settings.defaultPollIntervalSec).toBe(DEFAULT_PR_POLL_INTERVAL_SEC);
expect(settings.defaultAgentProvider).toBe(DEFAULT_PR_AGENT_PROVIDER);
expect(settings.defaultPromptTemplate).toBe(DEFAULT_PR_PROMPT_TEMPLATE);
expect(settings.defaultGithubToken).toBe("");
});

test("updates persist", () => {
updatePrTrackerSettings({
defaultPollIntervalSec: 600,
defaultAgentProvider: "claudecode",
defaultGithubToken: " ghp_abc ",
});
const settings = getPrTrackerSettings();
expect(settings.defaultPollIntervalSec).toBe(600);
expect(settings.defaultAgentProvider).toBe("claudecode");
expect(settings.defaultGithubToken).toBe("ghp_abc");
});

test("rejects too-short poll interval", () => {
expect(() => updatePrTrackerSettings({ defaultPollIntervalSec: 30 })).toThrow();
});

test("rejects invalid agent provider", () => {
expect(() =>
updatePrTrackerSettings({ defaultAgentProvider: "bogus" })
).toThrow(/Unsupported agent/);
});
});

describe("pr-trackers scan", () => {
Expand Down Expand Up @@ -206,14 +196,13 @@ describe("pr-trackers scan", () => {
});

describe("pr-trackers enable/update", () => {
test("enabling without a target channel throws", () => {
test("enabling a scanned tracker does not require any extra config", () => {
scanPrTrackers(
makeProbe({ "/tmp/repos/ode": { host: "github.com", owner: "anomalyco", repo: "ode" } })
);
const tracker = listPrTrackers()[0]!;
expect(() => updatePrTracker(tracker.id, { enabled: true })).toThrow(
/target channel/
);
const updated = updatePrTracker(tracker.id, { enabled: true });
expect(updated.enabled).toBe(true);
});

test("first enable snaps last_polled_at to now so we don't backfill", () => {
Expand All @@ -226,12 +215,10 @@ describe("pr-trackers enable/update", () => {
const before = Date.now();
const updated = updatePrTracker(tracker.id, {
enabled: true,
targetChannelId: "C_WEB",
});
const after = Date.now();

expect(updated.enabled).toBe(true);
expect(updated.targetChannelId).toBe("C_WEB");
expect(updated.lastPolledAt).not.toBeNull();
expect(updated.lastPolledAt!).toBeGreaterThanOrEqual(before);
expect(updated.lastPolledAt!).toBeLessThanOrEqual(after);
Expand All @@ -242,7 +229,7 @@ describe("pr-trackers enable/update", () => {
makeProbe({ "/tmp/repos/ode": { host: "github.com", owner: "anomalyco", repo: "ode" } })
);
const id = listPrTrackers()[0]!.id;
const enabled = updatePrTracker(id, { enabled: true, targetChannelId: "C_DEV" });
const enabled = updatePrTracker(id, { enabled: true });
const originalCursor = enabled.lastPolledAt!;

updatePrTracker(id, { enabled: false });
Expand All @@ -251,7 +238,7 @@ describe("pr-trackers enable/update", () => {
const afterPoll = getPrTrackerById(id)!;
expect(afterPoll.lastPolledAt).toBe(originalCursor + 10_000);

const reEnabled = updatePrTracker(id, { enabled: true, targetChannelId: "C_DEV" });
const reEnabled = updatePrTracker(id, { enabled: true });
expect(reEnabled.lastPolledAt).toBe(originalCursor + 10_000);
});

Expand All @@ -262,7 +249,7 @@ describe("pr-trackers enable/update", () => {
scanPrTrackers(makeProbe({}));
const id = listPrTrackers()[0]!.id;
expect(() =>
updatePrTracker(id, { enabled: true, targetChannelId: "C_DEV" })
updatePrTracker(id, { enabled: true })
).toThrow(/missing/);
});

Expand All @@ -289,7 +276,7 @@ describe("pr-trackers due selection", () => {
makeProbe({ "/tmp/repos/ode": { host: "github.com", owner: "anomalyco", repo: "ode" } })
);
const id = listPrTrackers()[0]!.id;
updatePrTracker(id, { enabled: true, targetChannelId: "C_DEV", pollIntervalSec: 60 });
updatePrTracker(id, { enabled: true, pollIntervalSec: 60 });
// Simulate a very old last-poll timestamp.
markPrTrackerPolled(id, { success: true, pollCompletedAt: 0 });
const due = listDuePrTrackers(Date.now());
Expand All @@ -301,7 +288,7 @@ describe("pr-trackers due selection", () => {
makeProbe({ "/tmp/repos/ode": { host: "github.com", owner: "anomalyco", repo: "ode" } })
);
const id = listPrTrackers()[0]!.id;
updatePrTracker(id, { enabled: true, targetChannelId: "C_DEV", pollIntervalSec: 1800 });
updatePrTracker(id, { enabled: true, pollIntervalSec: 1800 });
markPrTrackerPolled(id, { success: true });
expect(listDuePrTrackers(Date.now())).toHaveLength(0);
});
Expand Down
Loading
Loading