Skip to content

Commit a7039e8

Browse files
authored
chore(api): Fix GraphQLAuthDirectiveIntegrationTests build (#2690)
* chore(api): Fix GraphQLAuthDirectiveIntegrationTests build * Add given-when-then comments * Address review comments
1 parent eeeb561 commit a7039e8

File tree

12 files changed

+589
-628
lines changed

12 files changed

+589
-628
lines changed

.github/workflows/integ_test_api.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,33 @@ jobs:
8282
project_path: ./AmplifyPlugins/API/Tests/APIHostApp
8383
scheme: AWSAPIPluginGraphQLUserPoolTests
8484

85+
api-graphql-auth-directive-test:
86+
if: ${{ false }}
87+
needs: prepare-for-test
88+
runs-on: macos-12
89+
environment: IntegrationTest
90+
steps:
91+
- uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
92+
with:
93+
persist-credentials: false
94+
95+
- name: Make directory
96+
run: mkdir -p ~/.aws-amplify/amplify-ios/testconfiguration/
97+
98+
- name: Copy integration test resouces
99+
uses: ./.github/composite_actions/download_test_configuration
100+
with:
101+
resource_subfolder: api
102+
aws_role_to_assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
103+
aws_region: ${{ secrets.AWS_REGION }}
104+
aws_s3_bucket: ${{ secrets.AWS_S3_BUCKET_INTEG }}
105+
106+
- name: Run Integration test
107+
uses: ./.github/composite_actions/run_xcodebuild_test
108+
with:
109+
project_path: ./AmplifyPlugins/API/Tests/APIHostApp
110+
scheme: AWSAPIPluginGraphQLAuthDirectiveTests
111+
85112
api-graphql-iam-test:
86113
if: ${{ false }}
87114
needs: prepare-for-test

AmplifyPlugins/API/Tests/APIHostApp/APIHostApp.xcodeproj/project.pbxproj

Lines changed: 47 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@
7979
21698C082889B173004BD994 /* TestExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21698C062889B173004BD994 /* TestExtensions.swift */; };
8080
21698C092889B173004BD994 /* TestCommonConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21698C072889B173004BD994 /* TestCommonConstants.swift */; };
8181
21698CC02889D5A9004BD994 /* CwlPreconditionTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 21698CBF2889D5A9004BD994 /* CwlPreconditionTesting */; };
82-
21698CC72889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests+Auth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21698CC22889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests+Auth.swift */; };
8382
21698CC92889D75F004BD994 /* SocialNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21698CC42889D75F004BD994 /* SocialNote.swift */; };
8483
21698CCB2889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21698CC62889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests.swift */; };
8584
219253C428BFEBE400820737 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 219253C328BFEBE200820737 /* XCTest.framework */; };
@@ -128,6 +127,8 @@
128127
97914BF62955872A002000EA /* AsyncExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681DFE7028E7451D0000C36A /* AsyncExpectation.swift */; };
129128
97914C1A295588DA002000EA /* GraphQLAPIStressTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97914BC529558714002000EA /* GraphQLAPIStressTests.swift */; };
130129
97914C1E29558AF2002000EA /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 97914C1D29558AF2002000EA /* README.md */; };
130+
97D4946D2981AF9900397C75 /* AuthSignInHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D4946B2981AF9900397C75 /* AuthSignInHelper.swift */; };
131+
97D4946E2981AF9900397C75 /* TestConfigHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D4946C2981AF9900397C75 /* TestConfigHelper.swift */; };
131132
/* End PBXBuildFile section */
132133

133134
/* Begin PBXContainerItemProxy section */
@@ -244,7 +245,7 @@
244245
213DBC8628A6CEDD00B30280 /* Todo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Todo.swift; sourceTree = "<group>"; };
245246
213DBC8828A700E000B30280 /* SubscriptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionView.swift; sourceTree = "<group>"; };
246247
21698A7B28899804004BD994 /* AWSAPIPluginFunctionalTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AWSAPIPluginFunctionalTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
247-
21698A9528899818004BD994 /* AWSAPIPluginIntegrationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AWSAPIPluginIntegrationTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
248+
21698A9528899818004BD994 /* AWSAPIPluginGraphQLAuthDirectiveTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AWSAPIPluginGraphQLAuthDirectiveTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
248249
21698A9F28899921004BD994 /* Todo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Todo.swift; sourceTree = "<group>"; };
249250
21698AA82889996A004BD994 /* GraphQLConnectionScenario1Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLConnectionScenario1Tests.swift; sourceTree = "<group>"; };
250251
21698AA92889996A004BD994 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
@@ -273,10 +274,8 @@
273274
21698BCE28899BCF004BD994 /* RESTWithUserPoolIntegrationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTWithUserPoolIntegrationTests.swift; sourceTree = "<group>"; };
274275
21698C062889B173004BD994 /* TestExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestExtensions.swift; path = ../../../../../AmplifyTestCommon/TestExtensions.swift; sourceTree = "<group>"; };
275276
21698C072889B173004BD994 /* TestCommonConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestCommonConstants.swift; path = ../../../../../AmplifyTestCommon/TestCommonConstants.swift; sourceTree = "<group>"; };
276-
21698CC22889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests+Auth.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GraphQLAuthDirectiveIntegrationTests+Auth.swift"; sourceTree = "<group>"; };
277277
21698CC32889D75F004BD994 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
278278
21698CC42889D75F004BD994 /* SocialNote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocialNote.swift; sourceTree = "<group>"; };
279-
21698CC52889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests+Support.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GraphQLAuthDirectiveIntegrationTests+Support.swift"; sourceTree = "<group>"; };
280279
21698CC62889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLAuthDirectiveIntegrationTests.swift; sourceTree = "<group>"; };
281280
219253C328BFEBE200820737 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
282281
21D335B7289867FC00657B12 /* amplify-ios-staging */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "amplify-ios-staging"; path = ../../../..; sourceTree = "<group>"; };
@@ -304,6 +303,8 @@
304303
97914BC529558714002000EA /* GraphQLAPIStressTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphQLAPIStressTests.swift; sourceTree = "<group>"; };
305304
97914C182955872A002000EA /* GraphQLAPIStressTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GraphQLAPIStressTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
306305
97914C1D29558AF2002000EA /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
306+
97D4946B2981AF9900397C75 /* AuthSignInHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthSignInHelper.swift; sourceTree = "<group>"; };
307+
97D4946C2981AF9900397C75 /* TestConfigHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestConfigHelper.swift; sourceTree = "<group>"; };
307308
/* End PBXFileReference section */
308309

309310
/* Begin PBXFrameworksBuildPhase section */
@@ -483,40 +484,15 @@
483484
path = AWSAPIPluginFunctionalTests;
484485
sourceTree = "<group>";
485486
};
486-
21698A9628899818004BD994 /* AWSAPIPluginIntegrationTests */ = {
487-
isa = PBXGroup;
488-
children = (
489-
21698B9528899AE3004BD994 /* GraphQL */,
490-
);
491-
path = AWSAPIPluginIntegrationTests;
492-
sourceTree = "<group>";
493-
};
494-
21698B9528899AE3004BD994 /* GraphQL */ = {
495-
isa = PBXGroup;
496-
children = (
497-
21698B9828899B02004BD994 /* GraphQLWithUserPoolIntegrationTests */,
498-
);
499-
path = GraphQL;
500-
sourceTree = "<group>";
501-
};
502-
21698B9828899B02004BD994 /* GraphQLWithUserPoolIntegrationTests */ = {
503-
isa = PBXGroup;
504-
children = (
505-
21698BC328899B71004BD994 /* AuthDirective */,
506-
);
507-
path = GraphQLWithUserPoolIntegrationTests;
508-
sourceTree = "<group>";
509-
};
510-
21698BC328899B71004BD994 /* AuthDirective */ = {
487+
21698A9628899818004BD994 /* AWSAPIPluginIGraphQLAuthDirectiveTests */ = {
511488
isa = PBXGroup;
512489
children = (
490+
97D4946A2981AF6000397C75 /* Base */,
513491
21698CC62889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests.swift */,
514-
21698CC22889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests+Auth.swift */,
515-
21698CC52889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests+Support.swift */,
516-
21698CC32889D75F004BD994 /* README.md */,
517492
21698CC42889D75F004BD994 /* SocialNote.swift */,
493+
21698CC32889D75F004BD994 /* README.md */,
518494
);
519-
path = AuthDirective;
495+
path = AWSAPIPluginIGraphQLAuthDirectiveTests;
520496
sourceTree = "<group>";
521497
};
522498
21698BD728899EBB004BD994 /* Frameworks */ = {
@@ -541,7 +517,7 @@
541517
21D335B6289867FC00657B12 /* Packages */,
542518
21E73E6D28898D7900D7DB7E /* APIHostApp */,
543519
21698A7C28899805004BD994 /* AWSAPIPluginFunctionalTests */,
544-
21698A9628899818004BD994 /* AWSAPIPluginIntegrationTests */,
520+
21698A9628899818004BD994 /* AWSAPIPluginIGraphQLAuthDirectiveTests */,
545521
39E0F13E289DD57D00939D9F /* AWSAPIPluginGraphQLIAMTests */,
546522
39E0F2A228A43FB100939D9F /* AWSAPIPluginGraphQLUserPoolTests */,
547523
213DBC7628A6C47000B30280 /* AWSAPIPluginGraphQLLambdaAuthTests */,
@@ -558,7 +534,7 @@
558534
children = (
559535
21E73E6B28898D7900D7DB7E /* APIHostApp.app */,
560536
21698A7B28899804004BD994 /* AWSAPIPluginFunctionalTests.xctest */,
561-
21698A9528899818004BD994 /* AWSAPIPluginIntegrationTests.xctest */,
537+
21698A9528899818004BD994 /* AWSAPIPluginGraphQLAuthDirectiveTests.xctest */,
562538
39E0F13D289DD57D00939D9F /* AWSAPIPluginGraphQLIAMTests.xctest */,
563539
39E0F2A128A43FB100939D9F /* AWSAPIPluginGraphQLUserPoolTests.xctest */,
564540
213DBC7528A6C47000B30280 /* AWSAPIPluginGraphQLLambdaAuthTests.xctest */,
@@ -699,6 +675,15 @@
699675
path = GraphQLAPIStressTests;
700676
sourceTree = "<group>";
701677
};
678+
97D4946A2981AF6000397C75 /* Base */ = {
679+
isa = PBXGroup;
680+
children = (
681+
97D4946B2981AF9900397C75 /* AuthSignInHelper.swift */,
682+
97D4946C2981AF9900397C75 /* TestConfigHelper.swift */,
683+
);
684+
path = Base;
685+
sourceTree = "<group>";
686+
};
702687
/* End PBXGroup section */
703688

704689
/* Begin PBXNativeTarget section */
@@ -740,22 +725,23 @@
740725
productReference = 21698A7B28899804004BD994 /* AWSAPIPluginFunctionalTests.xctest */;
741726
productType = "com.apple.product-type.bundle.unit-test";
742727
};
743-
21698A9428899818004BD994 /* AWSAPIPluginIntegrationTests */ = {
728+
21698A9428899818004BD994 /* AWSAPIPluginGraphQLAuthDirectiveTests */ = {
744729
isa = PBXNativeTarget;
745-
buildConfigurationList = 21698A9B28899818004BD994 /* Build configuration list for PBXNativeTarget "AWSAPIPluginIntegrationTests" */;
730+
buildConfigurationList = 21698A9B28899818004BD994 /* Build configuration list for PBXNativeTarget "AWSAPIPluginGraphQLAuthDirectiveTests" */;
746731
buildPhases = (
747732
21698A9128899818004BD994 /* Sources */,
748733
21698A9228899818004BD994 /* Frameworks */,
749734
21698A9328899818004BD994 /* Resources */,
735+
97D494692981A6E000397C75 /* Copy Configuration Files */,
750736
);
751737
buildRules = (
752738
);
753739
dependencies = (
754740
21698A9A28899818004BD994 /* PBXTargetDependency */,
755741
);
756-
name = AWSAPIPluginIntegrationTests;
742+
name = AWSAPIPluginGraphQLAuthDirectiveTests;
757743
productName = AWSAPIPluginIntegrationTests;
758-
productReference = 21698A9528899818004BD994 /* AWSAPIPluginIntegrationTests.xctest */;
744+
productReference = 21698A9528899818004BD994 /* AWSAPIPluginGraphQLAuthDirectiveTests.xctest */;
759745
productType = "com.apple.product-type.bundle.unit-test";
760746
};
761747
21E73E6A28898D7800D7DB7E /* APIHostApp */ = {
@@ -939,7 +925,7 @@
939925
targets = (
940926
21E73E6A28898D7800D7DB7E /* APIHostApp */,
941927
21698A7A28899804004BD994 /* AWSAPIPluginFunctionalTests */,
942-
21698A9428899818004BD994 /* AWSAPIPluginIntegrationTests */,
928+
21698A9428899818004BD994 /* AWSAPIPluginGraphQLAuthDirectiveTests */,
943929
39E0F13C289DD57D00939D9F /* AWSAPIPluginGraphQLIAMTests */,
944930
39E0F2A028A43FB100939D9F /* AWSAPIPluginGraphQLUserPoolTests */,
945931
213DBC7428A6C47000B30280 /* AWSAPIPluginGraphQLLambdaAuthTests */,
@@ -1146,6 +1132,24 @@
11461132
shellPath = /bin/sh;
11471133
shellScript = "TEMP_FILE=$HOME/.aws-amplify/amplify-ios/testconfiguration/.\nDEST_PATH=\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/testconfiguration/\"\n\nif [[ ! -d $TEMP_FILE ]] ; then\n echo \"${TEMP_FILE} does not exist. Using empty configuration.\"\n exit 0\nfi\n\nif [[ -f $DEST_PATH ]] ; then\n rm $DEST_PATH\nfi\n \ncp -r $TEMP_FILE $DEST_PATH\n";
11481134
};
1135+
97D494692981A6E000397C75 /* Copy Configuration Files */ = {
1136+
isa = PBXShellScriptBuildPhase;
1137+
buildActionMask = 2147483647;
1138+
files = (
1139+
);
1140+
inputFileListPaths = (
1141+
);
1142+
inputPaths = (
1143+
);
1144+
name = "Copy Configuration Files";
1145+
outputFileListPaths = (
1146+
);
1147+
outputPaths = (
1148+
);
1149+
runOnlyForDeploymentPostprocessing = 0;
1150+
shellPath = /bin/sh;
1151+
shellScript = "TEMP_FILE=$HOME/.aws-amplify/amplify-ios/testconfiguration/.\nDEST_PATH=\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/testconfiguration/\"\n\nif [[ ! -d $TEMP_FILE ]] ; then\n echo \"${TEMP_FILE} does not exist. Using empty configuration.\"\n exit 0\nfi\n\nif [[ -f $DEST_PATH ]] ; then\n rm $DEST_PATH\nfi\n \ncp -r $TEMP_FILE $DEST_PATH\n";
1152+
};
11491153
/* End PBXShellScriptBuildPhase section */
11501154

11511155
/* Begin PBXSourcesBuildPhase section */
@@ -1242,8 +1246,9 @@
12421246
681DFE9828E747430000C36A /* AsyncTesting.swift in Sources */,
12431247
681DFE9A28E747430000C36A /* XCTestCase+AsyncTesting.swift in Sources */,
12441248
681DFE9928E747430000C36A /* AsyncExpectation.swift in Sources */,
1245-
21698CC72889D75F004BD994 /* GraphQLAuthDirectiveIntegrationTests+Auth.swift in Sources */,
1249+
97D4946E2981AF9900397C75 /* TestConfigHelper.swift in Sources */,
12461250
21698CC92889D75F004BD994 /* SocialNote.swift in Sources */,
1251+
97D4946D2981AF9900397C75 /* AuthSignInHelper.swift in Sources */,
12471252
);
12481253
runOnlyForDeploymentPostprocessing = 0;
12491254
};
@@ -1897,7 +1902,7 @@
18971902
defaultConfigurationIsVisible = 0;
18981903
defaultConfigurationName = Release;
18991904
};
1900-
21698A9B28899818004BD994 /* Build configuration list for PBXNativeTarget "AWSAPIPluginIntegrationTests" */ = {
1905+
21698A9B28899818004BD994 /* Build configuration list for PBXNativeTarget "AWSAPIPluginGraphQLAuthDirectiveTests" */ = {
19011906
isa = XCConfigurationList;
19021907
buildConfigurations = (
19031908
21698A9C28899818004BD994 /* Debug */,

AmplifyPlugins/API/Tests/APIHostApp/APIHostApp.xcodeproj/xcshareddata/xcschemes/AWSAPIPluginIntegrationTests.xcscheme

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
<BuildableReference
1818
BuildableIdentifier = "primary"
1919
BlueprintIdentifier = "21698A9428899818004BD994"
20-
BuildableName = "AWSAPIPluginIntegrationTests.xctest"
21-
BlueprintName = "AWSAPIPluginIntegrationTests"
20+
BuildableName = "AWSAPIPluginGraphQLAuthDirectiveTests.xctest"
21+
BlueprintName = "AWSAPIPluginGraphQLAuthDirectiveTests"
2222
ReferencedContainer = "container:APIHostApp.xcodeproj">
2323
</BuildableReference>
2424
</TestableReference>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import Amplify
9+
10+
public typealias CompletionType = (Bool, AuthError?) -> Void
11+
12+
public struct AuthSignInHelper {
13+
14+
public static func signUpUser(username: String, password: String, email: String) async throws -> AuthSignUpResult {
15+
let options = AuthSignUpRequest.Options(userAttributes: [AuthUserAttribute(.email, value: email)])
16+
return try await Amplify.Auth.signUp(username: username, password: password, options: options)
17+
}
18+
19+
public static func signInUser(username: String, password: String) async throws -> AuthSignInResult {
20+
return try await Amplify.Auth.signIn(username: username, password: password, options: nil)
21+
}
22+
23+
public static func registerAndSignInUser(username: String, password: String, email: String) async throws -> Bool {
24+
_ = try await AuthSignInHelper.signUpUser(username: username, password: password, email: email)
25+
let result = try await AuthSignInHelper.signInUser(username: username, password: password)
26+
return result.isSignedIn
27+
}
28+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
import Foundation
9+
@testable import Amplify
10+
11+
class TestConfigHelper {
12+
13+
static func retrieveAmplifyConfiguration(forResource: String) throws -> AmplifyConfiguration {
14+
15+
let data = try retrieve(forResource: forResource)
16+
return try AmplifyConfiguration.decodeAmplifyConfiguration(from: data)
17+
}
18+
19+
static func retrieveCredentials(forResource: String) throws -> [String: String] {
20+
let data = try retrieve(forResource: forResource)
21+
22+
let jsonOptional = try JSONSerialization.jsonObject(with: data, options: []) as? [String: String]
23+
guard let json = jsonOptional else {
24+
throw "Could not deserialize `\(forResource)` into JSON object"
25+
}
26+
27+
return json
28+
}
29+
30+
static func retrieve(forResource: String) throws -> Data {
31+
guard let path = Bundle(for: self).path(forResource: forResource, ofType: "json") else {
32+
throw "Could not retrieve configuration file: \(forResource)"
33+
}
34+
35+
let url = URL(fileURLWithPath: path)
36+
return try Data(contentsOf: url)
37+
}
38+
}

0 commit comments

Comments
 (0)