mirror of
https://github.com/kennethnym/aris.git
synced 2026-03-24 02:51:17 +00:00
feat: runtime provider hotswap (#82)
Add ability to replace a FeedSourceProvider at runtime and propagate the new source to all active (and pending) user sessions, invalidating their feed caches. Co-authored-by: Ona <no-reply@ona.com>
This commit is contained in:
@@ -180,6 +180,31 @@ describe("FeedEngine", () => {
|
||||
|
||||
expect(engine.refresh()).resolves.toBeDefined()
|
||||
})
|
||||
|
||||
test("register invalidates feed cache", async () => {
|
||||
const location = createLocationSource()
|
||||
const engine = new FeedEngine().register(location)
|
||||
|
||||
await engine.refresh()
|
||||
expect(engine.lastFeed()).not.toBeNull()
|
||||
|
||||
engine.register(createWeatherSource())
|
||||
|
||||
expect(engine.lastFeed()).toBeNull()
|
||||
})
|
||||
|
||||
test("unregister invalidates feed cache", async () => {
|
||||
const location = createLocationSource()
|
||||
const weather = createWeatherSource()
|
||||
const engine = new FeedEngine().register(location).register(weather)
|
||||
|
||||
await engine.refresh()
|
||||
expect(engine.lastFeed()).not.toBeNull()
|
||||
|
||||
engine.unregister("weather")
|
||||
|
||||
expect(engine.lastFeed()).toBeNull()
|
||||
})
|
||||
})
|
||||
|
||||
describe("graph validation", () => {
|
||||
@@ -934,4 +959,54 @@ describe("FeedEngine", () => {
|
||||
engine.stop()
|
||||
})
|
||||
})
|
||||
|
||||
describe("invalidateCache", () => {
|
||||
test("clears cached result", async () => {
|
||||
const location = createLocationSource()
|
||||
const engine = new FeedEngine().register(location)
|
||||
|
||||
await engine.refresh()
|
||||
expect(engine.lastFeed()).not.toBeNull()
|
||||
|
||||
engine.invalidateCache()
|
||||
|
||||
expect(engine.lastFeed()).toBeNull()
|
||||
})
|
||||
|
||||
test("is safe to call when no cache exists", () => {
|
||||
const engine = new FeedEngine()
|
||||
|
||||
expect(() => engine.invalidateCache()).not.toThrow()
|
||||
expect(engine.lastFeed()).toBeNull()
|
||||
})
|
||||
})
|
||||
|
||||
describe("isStarted", () => {
|
||||
test("returns false before start", () => {
|
||||
const engine = new FeedEngine()
|
||||
|
||||
expect(engine.isStarted()).toBe(false)
|
||||
})
|
||||
|
||||
test("returns true after start", () => {
|
||||
const location = createLocationSource()
|
||||
const engine = new FeedEngine().register(location)
|
||||
|
||||
engine.start()
|
||||
|
||||
expect(engine.isStarted()).toBe(true)
|
||||
|
||||
engine.stop()
|
||||
})
|
||||
|
||||
test("returns false after stop", () => {
|
||||
const location = createLocationSource()
|
||||
const engine = new FeedEngine().register(location)
|
||||
|
||||
engine.start()
|
||||
engine.stop()
|
||||
|
||||
expect(engine.isStarted()).toBe(false)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user