From 45bf4ba3ad8183cba764c6bc938aa8dba6c788fc Mon Sep 17 00:00:00 2001 From: Calvin Cestari Date: Mon, 18 Mar 2024 14:35:42 -0700 Subject: [PATCH 1/2] Updates package version format --- .../Sources/CodegenCLI/Extensions/VersionChecker.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apollo-ios-codegen/Sources/CodegenCLI/Extensions/VersionChecker.swift b/apollo-ios-codegen/Sources/CodegenCLI/Extensions/VersionChecker.swift index 731bece8d..87d6f637f 100644 --- a/apollo-ios-codegen/Sources/CodegenCLI/Extensions/VersionChecker.swift +++ b/apollo-ios-codegen/Sources/CodegenCLI/Extensions/VersionChecker.swift @@ -158,13 +158,14 @@ struct PackageResolvedModel { enum FileFormatVersion: Int { case v1 = 1 case v2 = 2 + case v3 = 3 func getPackageList(fromPackageResolvedJSON json: [String: Any]) -> ObjectList? { switch self { case .v1: return (json["object"] as? Object)?["pins"] as? ObjectList - case .v2: + case .v2, .v3: return json["pins"] as? ObjectList } } @@ -174,7 +175,7 @@ struct PackageResolvedModel { case .v1: return package["package"] as? String - case .v2: + case .v2, .v3: return package["identity"] as? String } } From ec2b0450cb638dc05b808e297a58d4953b5896ea Mon Sep 17 00:00:00 2001 From: Calvin Cestari Date: Tue, 19 Mar 2024 12:37:13 -0700 Subject: [PATCH 2/2] Refactor tests for all known resolved file format versions --- .../CodegenCLITests/VersionCheckerTests.swift | 380 ++++++++++-------- 1 file changed, 216 insertions(+), 164 deletions(-) diff --git a/Tests/CodegenCLITests/VersionCheckerTests.swift b/Tests/CodegenCLITests/VersionCheckerTests.swift index f0d2e777b..54d22d645 100644 --- a/Tests/CodegenCLITests/VersionCheckerTests.swift +++ b/Tests/CodegenCLITests/VersionCheckerTests.swift @@ -35,216 +35,268 @@ class VersionCheckerTests: XCTestCase { fileManager = nil } - private func version1PackageResolvedFileBody(apolloVersion version: String) -> String { - return """ - { - "object": { - "pins": [ - { - "package": "Apollo", - "repositoryURL": "https://github.com/apollographql/apollo-ios.git", - "state": { - "branch": null, - "revision": "5349afb4e9d098776cc44280258edd5f2ae571ed", - "version": "\(version)" - } - } - ] - }, - "version": 1 + private enum packageResolvedVersion: CaseIterable { + case v1 + case v2 + case v3 + + private var int: Int { + switch self { + case .v1: 1 + case .v2: 2 + case .v3: 3 + } } - """ - } - private func version2PackageResolvedFileBody(apolloVersion version: String) -> String { - return """ - { - "pins": [ + func fileBody(apolloVersion version: String) -> String { + switch self { + case .v1: + return """ { - "identity": "apollo-ios", - "kind" : "remoteSourceControl", - "location": "https://github.com/apollographql/apollo-ios.git", - "state": { - "revision": "5349afb4e9d098776cc44280258edd5f2ae571ed", - "version": "\(version)" - } + "object": { + "pins": [ + { + "package": "Apollo", + "repositoryURL": "https://github.com/apollographql/apollo-ios.git", + "state": { + "branch": null, + "revision": "5349afb4e9d098776cc44280258edd5f2ae571ed", + "version": "\(version)" + } + } + ] + }, + "version": 1 } - ], - "version": 2 + """ + + case .v2, .v3: + return """ + { + "pins": [ + { + "identity": "apollo-ios", + "kind" : "remoteSourceControl", + "location": "https://github.com/apollographql/apollo-ios.git", + "state": { + "revision": "5349afb4e9d098776cc44280258edd5f2ae571ed", + "version": "\(version)" + } + } + ], + "version": \(self.int) + } + """ + } } - """ } // MARK: - Tests - func test__matchCLIVersionToApolloVersion__givenNoPackageResolvedFileInProject_returnsNoApolloVersionFound() throws { - // when - let result = try VersionChecker.matchCLIVersionToApolloVersion( - projectRootURL: fileManager.directoryURL - ) - - // then - expect(result).to(equal(.noApolloVersionFound)) - } - - func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInProjectRoot_withVersion1FileFormat_hasMatchingVersion_returns_versionMatch() throws { - // given - try fileManager.createFile( - body: version1PackageResolvedFileBody(apolloVersion: Constants.CLIVersion), - named: "Package.resolved" - ) - - // when - let result = try VersionChecker.matchCLIVersionToApolloVersion( - projectRootURL: fileManager.directoryURL - ) + private func testPackageResolvedFile( + packageVersion: packageResolvedVersion, + inDirectory directory: String? = nil, + apolloVersion: String, + _ test: (() throws -> Void) + ) rethrows { + expect(try self.fileManager.createFile( + body: packageVersion.fileBody(apolloVersion: apolloVersion), + named: "Package.resolved", + inDirectory: directory + )).notTo(throwError()) - // then - expect(result).to(equal(.versionMatch)) + try test() } - func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInProjectRoot_withVersion1FileFormat_hasNonMatchingVersion_returns_versionMismatch() throws { - // given - let apolloVersion = "1.0.0.test-1" - try fileManager.createFile( - body: version1PackageResolvedFileBody(apolloVersion: apolloVersion), - named: "Package.resolved" - ) - + func test__matchCLIVersionToApolloVersion__givenNoPackageResolvedFileInProject_returnsNoApolloVersionFound() throws { // when let result = try VersionChecker.matchCLIVersionToApolloVersion( projectRootURL: fileManager.directoryURL ) // then - expect(result).to(equal(.versionMismatch(cliVersion: Constants.CLIVersion, apolloVersion: apolloVersion))) + expect(result).to(equal(.noApolloVersionFound)) } - func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInProjectRoot_withVersion2FileFormat_hasMatchingVersion_returns_versionMatch() throws { + func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInProjectRoot_withKnownResolvedFileFormats_hasMatchingVersion_returns_versionMatch() throws { // given - try fileManager.createFile( - body: version2PackageResolvedFileBody(apolloVersion: Constants.CLIVersion), - named: "Package.resolved" - ) - - // when - let result = try VersionChecker.matchCLIVersionToApolloVersion( - projectRootURL: fileManager.directoryURL - ) - - // then - expect(result).to(equal(.versionMatch)) + for packageVersion in packageResolvedVersion.allCases { + try testPackageResolvedFile( + packageVersion: packageVersion, + apolloVersion: Constants.CLIVersion + ) { + + // when + let result = try VersionChecker.matchCLIVersionToApolloVersion( + projectRootURL: fileManager.directoryURL + ) + + // then + expect(result).to(equal(.versionMatch)) + } + } } - func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInProjectRoot_withVersion2FileFormat_hasNonMatchingVersion_returns_versionMismatch() throws { + func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInProjectRoot_withKnownResolvedFileFormats_hasNonMatchingVersion_returns_versionMismatch() throws { // given let apolloVersion = "1.0.0.test-1" - try fileManager.createFile( - body: version2PackageResolvedFileBody(apolloVersion: apolloVersion), - named: "Package.resolved" - ) - - // when - let result = try VersionChecker.matchCLIVersionToApolloVersion( - projectRootURL: fileManager.directoryURL - ) - // then - expect(result).to(equal(.versionMismatch(cliVersion: Constants.CLIVersion, apolloVersion: apolloVersion))) + for packageVersion in packageResolvedVersion.allCases { + try testPackageResolvedFile( + packageVersion: packageVersion, + apolloVersion: apolloVersion + ) { + + // when + let result = try VersionChecker.matchCLIVersionToApolloVersion( + projectRootURL: fileManager.directoryURL + ) + + // then + expect(result).to(equal( + .versionMismatch(cliVersion: Constants.CLIVersion, apolloVersion: apolloVersion) + )) + } + } } - func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeWorkspace_withVersion2FileFormat_hasMatchingVersion_returns_versionMatch() throws { + func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeWorkspace_withKnownResolvedFileFormats_hasMatchingVersion_returns_versionMatch() throws { // given - try fileManager.createFile( - body: version2PackageResolvedFileBody(apolloVersion: Constants.CLIVersion), - named: "Package.resolved", - inDirectory: "MyProject.xcworkspace/xcshareddata/swiftpm" - ) - - // when - let result = try VersionChecker.matchCLIVersionToApolloVersion( - projectRootURL: fileManager.directoryURL - ) - - // then - expect(result).to(equal(.versionMatch)) + for packageVersion in packageResolvedVersion.allCases { + try testPackageResolvedFile( + packageVersion: packageVersion, + inDirectory: "MyProject.xcworkspace/xcshareddata/swiftpm", + apolloVersion: Constants.CLIVersion + ) { + + // when + let result = try VersionChecker.matchCLIVersionToApolloVersion( + projectRootURL: fileManager.directoryURL + ) + + // then + expect(result).to(equal(.versionMatch)) + } + } } - func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeWorkspace_withVersion2FileFormat_hasNonMatchingVersion_returns_versionMismatch() throws { + func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeWorkspace_withKnownResolvedFileFormats_hasNonMatchingVersion_returns_versionMismatch() throws { // given let apolloVersion = "1.0.0.test-1" - try fileManager.createFile( - body: version2PackageResolvedFileBody(apolloVersion: apolloVersion), - named: "Package.resolved", - inDirectory: "MyProject.xcworkspace/xcshareddata/swiftpm" - ) - // when - let result = try VersionChecker.matchCLIVersionToApolloVersion( - projectRootURL: fileManager.directoryURL - ) - - // then - expect(result).to(equal(.versionMismatch(cliVersion: Constants.CLIVersion, apolloVersion: apolloVersion))) + for packageVersion in packageResolvedVersion.allCases { + try testPackageResolvedFile( + packageVersion: packageVersion, + inDirectory: "MyProject.xcworkspace/xcshareddata/swiftpm", + apolloVersion: apolloVersion + ) { + + // when + let result = try VersionChecker.matchCLIVersionToApolloVersion( + projectRootURL: fileManager.directoryURL + ) + + // then + expect(result).to(equal( + .versionMismatch(cliVersion: Constants.CLIVersion, apolloVersion: apolloVersion) + )) + } + } } - func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeProject_withVersion2FileFormat_hasMatchingVersion_returns_versionMatch() throws { + func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeProject_withKnownResolvedFileFormats_hasMatchingVersion_returns_versionMatch() throws { // given - try fileManager.createFile( - body: version2PackageResolvedFileBody(apolloVersion: Constants.CLIVersion), - named: "Package.resolved", - inDirectory: "MyProject.xcodeproj/project.xcworkspace/xcshareddata/swiftpm" - ) - - // when - let result = try VersionChecker.matchCLIVersionToApolloVersion( - projectRootURL: fileManager.directoryURL - ) - - // then - expect(result).to(equal(.versionMatch)) + for packageVersion in packageResolvedVersion.allCases { + try testPackageResolvedFile( + packageVersion: packageVersion, + inDirectory: "MyProject.xcodeproj/project.xcworkspace/xcshareddata/swiftpm", + apolloVersion: Constants.CLIVersion + ) { + + // when + let result = try VersionChecker.matchCLIVersionToApolloVersion( + projectRootURL: fileManager.directoryURL + ) + + // then + expect(result).to(equal(.versionMatch)) + } + } } - func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeProject_withVersion2FileFormat_hasNonMatchingVersion_returns_versionMismatch() throws { + func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeProject_withKnownResolvedFileFormats_hasNonMatchingVersion_returns_versionMismatch() throws { // given let apolloVersion = "1.0.0.test-1" - try fileManager.createFile( - body: version2PackageResolvedFileBody(apolloVersion: apolloVersion), - named: "Package.resolved", - inDirectory: "MyProject.xcodeproj/project.xcworkspace/xcshareddata/swiftpm" - ) - // when - let result = try VersionChecker.matchCLIVersionToApolloVersion( - projectRootURL: fileManager.directoryURL - ) - - // then - expect(result).to(equal(.versionMismatch(cliVersion: Constants.CLIVersion, apolloVersion: apolloVersion))) + for packageVersion in packageResolvedVersion.allCases { + try testPackageResolvedFile( + packageVersion: packageVersion, + inDirectory: "MyProject.xcodeproj/project.xcworkspace/xcshareddata/swiftpm", + apolloVersion: apolloVersion + ) { + + // when + let result = try VersionChecker.matchCLIVersionToApolloVersion( + projectRootURL: fileManager.directoryURL + ) + + // then + expect(result).to(equal( + .versionMismatch(cliVersion: Constants.CLIVersion, apolloVersion: apolloVersion) + )) + } + } } - func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeWorkspaceAndProject_withVersion2FileFormat_hasMatchingVersion_returns_versionMatch_fromWorkspace() throws { + func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeWorkspaceAndProject_withKnownResolvedFileFormats_hasMatchingVersion_returns_versionMatch_fromWorkspace() throws { // given - try fileManager.createFile( - body: version2PackageResolvedFileBody(apolloVersion: Constants.CLIVersion), - named: "Package.resolved", - inDirectory: "MyProject.xcworkspace/xcshareddata/swiftpm" - ) - - let apolloProjectVersion = "1.0.0.test-1" - try fileManager.createFile( - body: version2PackageResolvedFileBody(apolloVersion: apolloProjectVersion), - named: "Package.resolved", - inDirectory: "MyProject.xcodeproj/project.xcworkspace/xcshareddata/swiftpm" - ) - - // when - let result = try VersionChecker.matchCLIVersionToApolloVersion( - projectRootURL: fileManager.directoryURL - ) + for packageVersion in packageResolvedVersion.allCases { + try fileManager.createFile( + body: packageVersion.fileBody(apolloVersion: Constants.CLIVersion), + named: "Package.resolved", + inDirectory: "MyProject.xcworkspace/xcshareddata/swiftpm" + ) + + try fileManager.createFile( + body: packageVersion.fileBody(apolloVersion: Constants.CLIVersion), + named: "Package.resolved", + inDirectory: "MyProject.xcodeproj/project.xcworkspace/xcshareddata/swiftpm" + ) + + // when + let result = try VersionChecker.matchCLIVersionToApolloVersion( + projectRootURL: fileManager.directoryURL + ) + + // then + expect(result).to(equal(.versionMatch)) + } + } - // then - expect(result).to(equal(.versionMatch)) + func test__matchCLIVersionToApolloVersion__givenPackageResolvedFileInXcodeWorkspaceAndProject_withKnownResolvedFileFormats_hasNonMatchingVersion_returns_versionMatch_fromWorkspace() throws { + // given + for packageVersion in packageResolvedVersion.allCases { + try fileManager.createFile( + body: packageVersion.fileBody(apolloVersion: Constants.CLIVersion), + named: "Package.resolved", + inDirectory: "MyProject.xcworkspace/xcshareddata/swiftpm" + ) + + let apolloProjectVersion = "1.0.0.test-1" + try fileManager.createFile( + body: packageVersion.fileBody(apolloVersion: apolloProjectVersion), + named: "Package.resolved", + inDirectory: "MyProject.xcodeproj/project.xcworkspace/xcshareddata/swiftpm" + ) + + // when + let result = try VersionChecker.matchCLIVersionToApolloVersion( + projectRootURL: fileManager.directoryURL + ) + + // then + expect(result).to(equal(.versionMatch)) + } } }