refactor: make fetchContext required on FeedSource

Sources that cannot provide context now return null
instead of omitting the method. The engine checks the
return value rather than method existence.

Co-authored-by: Ona <no-reply@ona.com>
This commit is contained in:
2026-02-14 16:20:24 +00:00
parent 476c6f06d9
commit 1f2920a7ad
12 changed files with 154 additions and 50 deletions

View File

@@ -52,11 +52,11 @@ describe("WeatherSource", () => {
describe("fetchContext", () => {
const mockClient = createMockClient(fixture.response as WeatherKitResponse)
test("returns empty when no location", async () => {
test("returns null when no location", async () => {
const source = new WeatherSource({ client: mockClient })
const result = await source.fetchContext(createMockContext())
expect(result).toEqual({})
expect(result).toBeNull()
})
test("returns simplified weather context", async () => {
@@ -64,7 +64,8 @@ describe("WeatherSource", () => {
const context = createMockContext({ lat: 37.7749, lng: -122.4194 })
const result = await source.fetchContext(context)
const weather = contextValue(result, WeatherKey)
expect(result).not.toBeNull()
const weather = contextValue(result! as Context, WeatherKey)
expect(weather).toBeDefined()
expect(typeof weather!.temperature).toBe("number")
@@ -81,7 +82,8 @@ describe("WeatherSource", () => {
const context = createMockContext({ lat: 37.7749, lng: -122.4194 })
const result = await source.fetchContext(context)
const weather = contextValue(result, WeatherKey)
expect(result).not.toBeNull()
const weather = contextValue(result! as Context, WeatherKey)
// Fixture has temperature around 10°C, imperial should be around 50°F
expect(weather!.temperature).toBeGreaterThan(40)

View File

@@ -111,10 +111,10 @@ export class WeatherSource implements FeedSource<WeatherFeedItem> {
this.units = options.units ?? Units.metric
}
async fetchContext(context: Context): Promise<Partial<Context>> {
async fetchContext(context: Context): Promise<Partial<Context> | null> {
const location = contextValue(context, LocationKey)
if (!location) {
return {}
return null
}
const response = await this.client.fetch({
@@ -123,7 +123,7 @@ export class WeatherSource implements FeedSource<WeatherFeedItem> {
})
if (!response.currentWeather) {
return {}
return null
}
const weather: Weather = {