Bläddra i källkod

fix: update ChadMusicAPIClient tests to use Keychain after migration

The Keychain migration (2410712) moved API key storage from UserDefaults
to KeychainService, but ChadMusicAPIClientTests still wrote/read via
UserDefaults — causing testIsConfiguredTrue and related tests to fail.

Updated all 5 affected tests to use KeychainService.saveAPIKey() /
deleteAPIKey(). tearDown now cleans both stores for safety. Also
registers new pipeline files (ChadMusicCredentials.swift,
KeychainMigrationTests.swift) in the Xcode project.

Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
aldiss 2 månader sedan
förälder
incheckning
81e5505015
2 ändrade filer med 14 tillägg och 5 borttagningar
  1. 8 0
      MixBoard.xcodeproj/project.pbxproj
  2. 6 5
      Tests/Unit/ChadMusicTests.swift

+ 8 - 0
MixBoard.xcodeproj/project.pbxproj

@@ -7,6 +7,7 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		013C7A2CED00B8F4023B409D /* KeychainMigrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5C8371A077D34C5EA5EB922 /* KeychainMigrationTests.swift */; };
 		0475F2DDF3E2B282DDD32730 /* ChadMusicTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BB9760CCC20660A8525CE39 /* ChadMusicTests.swift */; };
 		05250104065AC9F86AED7640 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF15B7B75D512A726CA44646 /* AppState.swift */; };
 		062F31FB5DC04601FA178F29 /* SyncWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5EB33906D8B83B47907EB73 /* SyncWatcher.swift */; };
@@ -31,6 +32,7 @@
 		45C89316C5AB16272EC76D9F /* TrackRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971D04012F71444725BB1846 /* TrackRow.swift */; };
 		461A7875FBC20ADCE231103E /* AudioStitcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A953E02F7201CEC5A42DBE /* AudioStitcher.swift */; };
 		48D625A899FB4CD97A1CAC48 /* GroupTemplateResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01A4B3C692C3BA27C29C084B /* GroupTemplateResolver.swift */; };
+		5604020B0302E9AC3B81CB90 /* ChadMusicCredentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = D46AA7D36F9C279C726D8DC8 /* ChadMusicCredentials.swift */; };
 		57994E3E18195FD31CBDC82B /* SidebarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10686F358CF00951BE31A568 /* SidebarView.swift */; };
 		58718BAD0FD35D0D999F7C43 /* LyricsParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24ADE9A538A9797BE2D7862B /* LyricsParser.swift */; };
 		5AA97C256D3B08ABF017DD0E /* PlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DB6892183CB93C7DD0FD546 /* PlayerView.swift */; };
@@ -159,6 +161,7 @@
 		C91BFDC4EF6125CE0A92C365 /* NowPlayingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NowPlayingView.swift; sourceTree = "<group>"; };
 		D0775318FF25759713C3063D /* AppIconConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconConfig.swift; sourceTree = "<group>"; };
 		D29A1F4EF5FB5ACA4CCA4BBF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		D46AA7D36F9C279C726D8DC8 /* ChadMusicCredentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChadMusicCredentials.swift; sourceTree = "<group>"; };
 		D5CB9510A25DFF0B3E7AA99E /* MediaKeyHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaKeyHandler.swift; sourceTree = "<group>"; };
 		D7E85070877C451ADE587391 /* Playlist.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Playlist.swift; sourceTree = "<group>"; };
 		D80C9BACD548FF942E79C82F /* GlobalSearchSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalSearchSheet.swift; sourceTree = "<group>"; };
@@ -172,6 +175,7 @@
 		EC342C71B1DC290341B225A6 /* MixBoardTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MixBoardTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		F0CD0921C8C90DA6D317E092 /* ChadMusicAPIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChadMusicAPIClient.swift; sourceTree = "<group>"; };
 		F39B366B5B7D28F1310EE4C4 /* PlaylistViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaylistViewModel.swift; sourceTree = "<group>"; };
+		F5C8371A077D34C5EA5EB922 /* KeychainMigrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainMigrationTests.swift; sourceTree = "<group>"; };
 		F83BB564B9EDF998724C368F /* ServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceTests.swift; sourceTree = "<group>"; };
 		F953CCDD5C91DE428195E31D /* AudioEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioEngine.swift; sourceTree = "<group>"; };
 		FF15B7B75D512A726CA44646 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = "<group>"; };
@@ -221,6 +225,7 @@
 				0848898ED1D633CA4A63D392 /* DownloadServiceTests.swift */,
 				1D66878FD3A9BC9745050D13 /* ExporterTests.swift */,
 				39571508168CC254BEB95639 /* FileNameTemplateTests.swift */,
+				F5C8371A077D34C5EA5EB922 /* KeychainMigrationTests.swift */,
 				6CF5F229E82115FB2EBC61D6 /* ModelTests.swift */,
 				F83BB564B9EDF998724C368F /* ServiceTests.swift */,
 			);
@@ -243,6 +248,7 @@
 				F953CCDD5C91DE428195E31D /* AudioEngine.swift */,
 				83791DE60BF73B44B44CF598 /* BPMDetector.swift */,
 				F0CD0921C8C90DA6D317E092 /* ChadMusicAPIClient.swift */,
+				D46AA7D36F9C279C726D8DC8 /* ChadMusicCredentials.swift */,
 				DC5615C432F50F99E53303D0 /* DownloadManager.swift */,
 				858F24E4F4EB9955E3DCE30A /* DownloadService.swift */,
 				DDEBC9A0E0A3C3ED59388601 /* KeychainService.swift */,
@@ -465,6 +471,7 @@
 				9490D1A0388F61D331934E7A /* BrowsePanel.swift in Sources */,
 				638D763E72DC3774160E414F /* ChadMusic.swift in Sources */,
 				C6C8A67458FC5DCFD06A1C5D /* ChadMusicAPIClient.swift in Sources */,
+				5604020B0302E9AC3B81CB90 /* ChadMusicCredentials.swift in Sources */,
 				31450D9ABC6BD3AD4BC160E2 /* CloudBrowserView.swift in Sources */,
 				97CD156068E3A732B75A822D /* ContentView.swift in Sources */,
 				AD8102FED08EEBF9E7CD5AE4 /* CuePoint.swift in Sources */,
@@ -529,6 +536,7 @@
 				42D7ED2A29566B252DADFC2D /* ExporterTests.swift in Sources */,
 				9C5A7DDD55E5367DB6E2AE96 /* FileNameTemplateTests.swift in Sources */,
 				19D734917A3D1D41990795E6 /* IntegrationTests.swift in Sources */,
+				013C7A2CED00B8F4023B409D /* KeychainMigrationTests.swift in Sources */,
 				7FD8DC64107B2249CD5BEF1E /* ModelTests.swift in Sources */,
 				3F3163BC5FFAA0EC64603580 /* ServiceTests.swift in Sources */,
 				2897F9B97E53C752BC8291EC /* TestHelpers.swift in Sources */,

+ 6 - 5
Tests/Unit/ChadMusicTests.swift

@@ -322,6 +322,7 @@ final class ChadMusicAPIClientTests: XCTestCase {
     override func tearDown() {
         super.tearDown()
         UserDefaults.standard.removeObject(forKey: "chadMusic.serverURL")
+        UserDefaults.standard.removeObject(forKey: "chadMusic.apiKey")
         KeychainService.deleteAPIKey()
     }
 
@@ -370,7 +371,7 @@ final class ChadMusicAPIClientTests: XCTestCase {
     func testIsConfiguredFalseWhenEmpty() {
         let client = ChadMusicAPIClient()
         client.serverURL = ""
-        UserDefaults.standard.removeObject(forKey: "chadMusic.apiKey")
+        KeychainService.deleteAPIKey()
         XCTAssertFalse(client.isConfigured)
     }
 
@@ -378,7 +379,7 @@ final class ChadMusicAPIClientTests: XCTestCase {
     func testIsConfiguredFalseWithoutKey() {
         let client = ChadMusicAPIClient()
         client.serverURL = "https://music.example.com"
-        UserDefaults.standard.removeObject(forKey: "chadMusic.apiKey")
+        KeychainService.deleteAPIKey()
         XCTAssertFalse(client.isConfigured)
     }
 
@@ -386,14 +387,14 @@ final class ChadMusicAPIClientTests: XCTestCase {
     func testIsConfiguredTrue() {
         let client = ChadMusicAPIClient()
         client.serverURL = "https://music.example.com"
-        UserDefaults.standard.set("test-key", forKey: "chadMusic.apiKey")
+        try! KeychainService.saveAPIKey("test-key")
         XCTAssertTrue(client.isConfigured)
     }
 
     @MainActor
     func testAuthHeaders() {
         let client = ChadMusicAPIClient()
-        UserDefaults.standard.set("my-secret-key", forKey: "chadMusic.apiKey")
+        try! KeychainService.saveAPIKey("my-secret-key")
 
         let headers = client.authHeaders
         XCTAssertEqual(headers["Authorization"], "Bearer my-secret-key")
@@ -402,7 +403,7 @@ final class ChadMusicAPIClientTests: XCTestCase {
     @MainActor
     func testAuthHeadersEmpty() {
         let client = ChadMusicAPIClient()
-        UserDefaults.standard.removeObject(forKey: "chadMusic.apiKey")
+        KeychainService.deleteAPIKey()
 
         let headers = client.authHeaders
         XCTAssertTrue(headers.isEmpty)