summaryrefslogtreecommitdiff
path: root/HutchTests/ContributionCalendarTests.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-13 19:44:44 -0500
committerChristian Cleberg <[email protected]>2026-04-13 19:44:44 -0500
commitfe1ccc69661603d419a642a450e4ac9e1258adb0 (patch)
tree386455b6b5468abdd9dfa46dd4802b10da8b77a2 /HutchTests/ContributionCalendarTests.swift
parent6ec9754ce34f331641b000eddef3d44bca2631a5 (diff)
downloadhutch-fe1ccc69661603d419a642a450e4ac9e1258adb0.tar.gz
hutch-fe1ccc69661603d419a642a450e4ac9e1258adb0.tar.bz2
hutch-fe1ccc69661603d419a642a450e4ac9e1258adb0.zip
fix: centralize URLs, tighten models, and polish SwiftUI bindingsv3.1.3
- Add shared HutchDeepLinkURL constants for app, widgets, and tests. - Bump marketing version to 3.1.2 and build to 70 (app + widget extension). - Point Hutch stats default base URL at HutchStatsAPI; add SRHTWebURL status incident feed and reuse it from SystemStatusService. - Group Project into Metadata and Resources; split ContributionStatsResponse into StatsWindow and StatsTotals with updated decoding and tests. - Replace @Bindable usage with explicit Bindings in Profile, Projects list, and repository ACL flows; simplify Home pinned-item helper; add no-op bodies on cancel alert buttons where the compiler requires a statement. - Move repository row build-status indicator next to the relative-updated caption and reserve a fixed 8×8 slot so the row does not jump when status loads. - Use NSString.lastPathComponent for build artifact filenames; collapse duplicate ACL error branches; minor HutchStats HTTP and XMLParserDelegate cleanups. - Point widgets at HutchDeepLinkURL helpers; align tests with the new response and URL types.
Diffstat (limited to 'HutchTests/ContributionCalendarTests.swift')
-rw-r--r--HutchTests/ContributionCalendarTests.swift108
1 files changed, 62 insertions, 46 deletions
diff --git a/HutchTests/ContributionCalendarTests.swift b/HutchTests/ContributionCalendarTests.swift
index 9e76e42..0328ad5 100644
--- a/HutchTests/ContributionCalendarTests.swift
+++ b/HutchTests/ContributionCalendarTests.swift
@@ -259,12 +259,12 @@ private final class MockContributionCalendarService: ContributionCalendarServing
self.statsResponses = statsResponses
}
- func fetchContributionCalendar(actor: String, endingOn endDate: Date) async throws -> ContributionCalendarResponse {
+ func fetchContributionCalendar(actor _: String, endingOn _: Date) async throws -> ContributionCalendarResponse {
fetchCalendarCallCount += 1
return calendarResponses[min(fetchCalendarCallCount - 1, calendarResponses.count - 1)]
}
- func fetchContributionStats(actor: String, endingOn endDate: Date) async throws -> ContributionStatsResponse {
+ func fetchContributionStats(actor _: String, endingOn _: Date) async throws -> ContributionStatsResponse {
fetchStatsCallCount += 1
return statsResponses[min(fetchStatsCallCount - 1, statsResponses.count - 1)]
}
@@ -348,65 +348,81 @@ private extension ContributionCalendarResponse {
private extension ContributionStatsResponse {
static func empty(actor: String, year: Int) -> Self {
ContributionStatsResponse(
- actor: actor,
- from: ContributionDateParser.parse("\(year)-01-01")!,
- to: ContributionDateParser.parse("\(year)-01-07")!,
- isIndexed: true,
- lastPolledAt: ContributionDateParser.parseTimestamp("\(year)-01-07T12:00:00Z"),
- indexingState: .indexed,
- totalEvents: 0,
- totalScore: 0,
- activeDays: 0,
- longestStreak: 0,
- currentStreak: 0
+ window: .init(
+ actor: actor,
+ from: ContributionDateParser.parse("\(year)-01-01")!,
+ to: ContributionDateParser.parse("\(year)-01-07")!,
+ isIndexed: true,
+ lastPolledAt: ContributionDateParser.parseTimestamp("\(year)-01-07T12:00:00Z"),
+ indexingState: .indexed
+ ),
+ totals: .init(
+ totalEvents: 0,
+ totalScore: 0,
+ activeDays: 0,
+ longestStreak: 0,
+ currentStreak: 0
+ )
)
}
static func active(actor: String, year: Int, totalEvents: Int, activeDays: Int, longestStreak: Int) -> Self {
ContributionStatsResponse(
- actor: actor,
- from: ContributionDateParser.parse("\(year)-01-01")!,
- to: ContributionDateParser.parse("\(year)-01-07")!,
- isIndexed: true,
- lastPolledAt: ContributionDateParser.parseTimestamp("\(year)-01-07T12:00:00Z"),
- indexingState: .indexed,
- totalEvents: totalEvents,
- totalScore: Double(totalEvents),
- activeDays: activeDays,
- longestStreak: longestStreak,
- currentStreak: 0
+ window: .init(
+ actor: actor,
+ from: ContributionDateParser.parse("\(year)-01-01")!,
+ to: ContributionDateParser.parse("\(year)-01-07")!,
+ isIndexed: true,
+ lastPolledAt: ContributionDateParser.parseTimestamp("\(year)-01-07T12:00:00Z"),
+ indexingState: .indexed
+ ),
+ totals: .init(
+ totalEvents: totalEvents,
+ totalScore: Double(totalEvents),
+ activeDays: activeDays,
+ longestStreak: longestStreak,
+ currentStreak: 0
+ )
)
}
static func pending(actor: String, year: Int) -> Self {
ContributionStatsResponse(
- actor: actor,
- from: ContributionDateParser.parse("\(year)-01-01")!,
- to: ContributionDateParser.parse("\(year)-01-07")!,
- isIndexed: false,
- lastPolledAt: nil,
- indexingState: .pending,
- totalEvents: 0,
- totalScore: 0,
- activeDays: 0,
- longestStreak: 0,
- currentStreak: 0
+ window: .init(
+ actor: actor,
+ from: ContributionDateParser.parse("\(year)-01-01")!,
+ to: ContributionDateParser.parse("\(year)-01-07")!,
+ isIndexed: false,
+ lastPolledAt: nil,
+ indexingState: .pending
+ ),
+ totals: .init(
+ totalEvents: 0,
+ totalScore: 0,
+ activeDays: 0,
+ longestStreak: 0,
+ currentStreak: 0
+ )
)
}
static func error(actor: String, year: Int) -> Self {
ContributionStatsResponse(
- actor: actor,
- from: ContributionDateParser.parse("\(year)-01-01")!,
- to: ContributionDateParser.parse("\(year)-01-07")!,
- isIndexed: false,
- lastPolledAt: nil,
- indexingState: .error,
- totalEvents: 0,
- totalScore: 0,
- activeDays: 0,
- longestStreak: 0,
- currentStreak: 0
+ window: .init(
+ actor: actor,
+ from: ContributionDateParser.parse("\(year)-01-01")!,
+ to: ContributionDateParser.parse("\(year)-01-07")!,
+ isIndexed: false,
+ lastPolledAt: nil,
+ indexingState: .error
+ ),
+ totals: .init(
+ totalEvents: 0,
+ totalScore: 0,
+ activeDays: 0,
+ longestStreak: 0,
+ currentStreak: 0
+ )
)
}
}