crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

FriendInviteRecencyStoreTests.swift (1775B)


      1 import Foundation
      2 import Testing
      3 @testable import Crossmate
      4 
      5 @MainActor
      6 @Suite("Friend invite recency")
      7 struct FriendInviteRecencyStoreTests {
      8     private func makeStore() throws -> FriendInviteRecencyStore {
      9         let suiteName = "friend-invite-recency-\(UUID().uuidString)"
     10         let defaults = try #require(UserDefaults(suiteName: suiteName))
     11         defaults.removePersistentDomain(forName: suiteName)
     12         return FriendInviteRecencyStore(defaults: defaults)
     13     }
     14 
     15     @Test("Invites are ranked from most to least recent")
     16     func ranksInvitesByRecentUse() throws {
     17         let store = try makeStore()
     18 
     19         store.recordInvite(to: "_alice")
     20         store.recordInvite(to: "_bob")
     21         store.recordInvite(to: "_carol")
     22 
     23         #expect(store.ranksByAuthorID == [
     24             "_carol": 0,
     25             "_bob": 1,
     26             "_alice": 2,
     27         ])
     28     }
     29 
     30     @Test("Inviting the same friend again moves them to the front")
     31     func reinviteMovesFriendToFront() throws {
     32         let store = try makeStore()
     33         store.recordInvite(to: "_alice")
     34         store.recordInvite(to: "_bob")
     35 
     36         store.recordInvite(to: "_alice")
     37 
     38         #expect(store.ranksByAuthorID == [
     39             "_alice": 0,
     40             "_bob": 1,
     41         ])
     42     }
     43 
     44     @Test("Invite ordering survives a new store instance")
     45     func persistsInviteOrdering() throws {
     46         let suiteName = "friend-invite-recency-\(UUID().uuidString)"
     47         let defaults = try #require(UserDefaults(suiteName: suiteName))
     48         defaults.removePersistentDomain(forName: suiteName)
     49         FriendInviteRecencyStore(defaults: defaults).recordInvite(to: "_alice")
     50 
     51         let reloaded = FriendInviteRecencyStore(defaults: defaults)
     52 
     53         #expect(reloaded.ranksByAuthorID == ["_alice": 0])
     54     }
     55 }