Skip to content

test(data): Gen2 data customize auth doc example testing #3705

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ import XCTest
@_spi(InternalAmplifyConfiguration) @testable import Amplify
@testable import APIHostApp
@testable import AWSPluginsCore
import AWSCognitoAuthPlugin

class AWSAPIPluginGen2GraphQLBaseTest: XCTestCase {

var defaultTestEmail = "test-\(UUID().uuidString)@amazon.com"

var amplifyConfig: AmplifyOutputsData!

override func setUp() {
Expand All @@ -39,11 +42,15 @@ class AWSAPIPluginGen2GraphQLBaseTest: XCTestCase {
/// Setup API with given models
/// - Parameter models: DataStore models
func setup(withModels models: AmplifyModelRegistration,
logLevel: LogLevel = .verbose) async {
logLevel: LogLevel = .verbose,
withAuthPlugin: Bool = false) async {
do {
setupConfig()
Amplify.Logging.logLevel = logLevel
try Amplify.add(plugin: AWSAPIPlugin(modelRegistration: models))
if withAuthPlugin {
try Amplify.add(plugin: AWSCognitoAuthPlugin())
}
try Amplify.configure(amplifyConfig)

} catch {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//

import Amplify
import XCTest

enum AuthSignInHelper {

static func signOut() async {
let session = try? await Amplify.Auth.fetchAuthSession()
if session?.isSignedIn ?? false {
_ = await Amplify.Auth.signOut()
}
}

static func signUpUser(
username: String,
password: String,
email: String,
phoneNumber: String? = nil) async throws -> Bool {

var userAttributes = [
AuthUserAttribute(.email, value: email)
]

if let phoneNumber = phoneNumber {
userAttributes.append(AuthUserAttribute(.phoneNumber, value: phoneNumber))
}

let options = AuthSignUpRequest.Options(
userAttributes: userAttributes)
let result = try await Amplify.Auth.signUp(username: username, password: password, options: options)
return result.isSignUpComplete
}

static func signInUser(username: String, password: String) async throws -> AuthSignInResult {
return try await Amplify.Auth.signIn(username: username, password: password, options: nil)
}

static func registerAndSignInUser(
username: String,
password: String,
email: String,
phoneNumber: String? = nil) async throws -> Bool {
await signOut()
let signedUp = try await AuthSignInHelper.signUpUser(
username: username,
password: password,
email: email,
phoneNumber: phoneNumber)
guard signedUp else {
throw AuthError.invalidState("Auth sign up failed", "", nil)
}
let result = try await AuthSignInHelper.signInUser(username: username, password: password)
return result.isSignedIn
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//

import Foundation
import XCTest
@testable import Amplify

final class GraphQLPost11Tests: AWSAPIPluginGen2GraphQLBaseTest {

// Code Snippet for
// https://docs.amplify.aws/swift/build-a-backend/data/customize-authz/#configure-multiple-authorization-rules
func testCodeSnippet() async throws {
await setup(withModels: Post11Models(), withAuthPlugin: true)
let username = "integTest\(UUID().uuidString)"
let password = "P123@\(UUID().uuidString)"
do {
_ = try await AuthSignInHelper.registerAndSignInUser(
username: username,
password: password,
email: defaultTestEmail)
} catch {
XCTFail("Could not sign up and sign in user \(error)")
}

// Code Snippet begins
do {
let post = Post(title: "Hello World")
let createdTodo = try await Amplify.API.mutate(request: .create(
post,
authMode: .amazonCognitoUserPools)).get()
} catch {
print("Failed to create post", error)
// Code Snippet Ends
XCTFail("Failed to create post \(error)")
// Code Snippet Begins
}

// Code Snippet ends
await AuthSignInHelper.signOut()
// Code Snippet begins

do {
let queriedPosts = try await Amplify.API.query(request: .list(
Post.self,
authMode: .awsIAM)).get()
print("Number of posts:", queriedPosts.count)

// Code Snippet Ends
XCTAssertTrue(queriedPosts.count > 0 || queriedPosts.hasNextPage())
// Code Snippet Begins
} catch {
print("Failed to list posts", error)
// Code Snippet Ends
XCTFail("Failed to list posts \(error)")
// Code Snippet Begins
}
}
}

extension GraphQLPost11Tests: DefaultLogger { }

extension GraphQLPost11Tests {
typealias Post = Post11

struct Post11Models: AmplifyModelRegistration {
public let version: String = "version"
func registerModels(registry: ModelRegistry.Type) {
ModelRegistry.register(modelType: Post11.self)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// swiftlint:disable all
import Amplify
import Foundation

extension Post11 {
// MARK: - CodingKeys
public enum CodingKeys: String, ModelKey {
case id
case title
case content
case createdAt
case updatedAt
}

public static let keys = CodingKeys.self
// MARK: - ModelSchema

public static let schema = defineSchema { model in
let post11 = Post11.keys

model.authRules = [
rule(allow: .public, provider: .iam, operations: [.read]),
rule(allow: .owner, ownerField: "owner", identityClaim: "cognito:username", provider: .userPools, operations: [.create, .update, .delete, .read])
]

model.listPluralName = "Post11s"
model.syncPluralName = "Post11s"

model.attributes(
.primaryKey(fields: [post11.id])
)

model.fields(
.field(post11.id, is: .required, ofType: .string),
.field(post11.title, is: .optional, ofType: .string),
.field(post11.content, is: .optional, ofType: .string),
.field(post11.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime),
.field(post11.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime)
)
}
public class Path: ModelPath<Post11> { }

public static var rootPath: PropertyContainerPath? { Path() }
}

extension Post11: ModelIdentifiable {
public typealias IdentifierFormat = ModelIdentifierFormat.Default
public typealias IdentifierProtocol = DefaultModelIdentifier<Self>
}
extension ModelPath where ModelType == Post11 {
public var id: FieldPath<String> {
string("id")
}
public var title: FieldPath<String> {
string("title")
}
public var content: FieldPath<String> {
string("content")
}
public var createdAt: FieldPath<Temporal.DateTime> {
datetime("createdAt")
}
public var updatedAt: FieldPath<Temporal.DateTime> {
datetime("updatedAt")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// swiftlint:disable all
import Amplify
import Foundation

public struct Post11: Model {
public let id: String
public var title: String?
public var content: String?
public var createdAt: Temporal.DateTime?
public var updatedAt: Temporal.DateTime?

public init(id: String = UUID().uuidString,
title: String? = nil,
content: String? = nil) {
self.init(id: id,
title: title,
content: content,
createdAt: nil,
updatedAt: nil)
}
internal init(id: String = UUID().uuidString,
title: String? = nil,
content: String? = nil,
createdAt: Temporal.DateTime? = nil,
updatedAt: Temporal.DateTime? = nil) {
self.id = id
self.title = title
self.content = content
self.createdAt = createdAt
self.updatedAt = updatedAt
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//

import Foundation
import XCTest
@testable import Amplify

final class GraphQLTodo12Tests: AWSAPIPluginGen2GraphQLBaseTest {

// Code Snippet for
// https://docs.amplify.aws/react/build-a-backend/data/customize-authz/public-data-access/#add-public-authorization-rule-using-api-key-based-authentication
func testCodeSnippet() async throws {
await setup(withModels: Todo12Models())

// Code Snippet begins
do {
let todo = Todo(content: "My new todo")
let createdTodo = try await Amplify.API.mutate(request: .create(
todo,
authMode: .apiKey)).get()
} catch {
print("Failed to create todo", error)
// Code Snippet Ends
XCTFail("Failed to create todo \(error)")
// Code Snippet Begins
}
}
}

extension GraphQLTodo12Tests: DefaultLogger { }

extension GraphQLTodo12Tests {
typealias Todo = Todo12

struct Todo12Models: AmplifyModelRegistration {
public let version: String = "version"
func registerModels(registry: ModelRegistry.Type) {
ModelRegistry.register(modelType: Todo12.self)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// swiftlint:disable all
import Amplify
import Foundation

extension Todo12 {
// MARK: - CodingKeys
public enum CodingKeys: String, ModelKey {
case id
case content
case createdAt
case updatedAt
}

public static let keys = CodingKeys.self
// MARK: - ModelSchema

public static let schema = defineSchema { model in
let todo12 = Todo12.keys

model.authRules = [
rule(allow: .public, provider: .apiKey, operations: [.create, .update, .delete, .read])
]

model.listPluralName = "Todo12s"
model.syncPluralName = "Todo12s"

model.attributes(
.primaryKey(fields: [todo12.id])
)

model.fields(
.field(todo12.id, is: .required, ofType: .string),
.field(todo12.content, is: .optional, ofType: .string),
.field(todo12.createdAt, is: .optional, isReadOnly: true, ofType: .dateTime),
.field(todo12.updatedAt, is: .optional, isReadOnly: true, ofType: .dateTime)
)
}
public class Path: ModelPath<Todo12> { }

public static var rootPath: PropertyContainerPath? { Path() }
}

extension Todo12: ModelIdentifiable {
public typealias IdentifierFormat = ModelIdentifierFormat.Default
public typealias IdentifierProtocol = DefaultModelIdentifier<Self>
}
extension ModelPath where ModelType == Todo12 {
public var id: FieldPath<String> {
string("id")
}
public var content: FieldPath<String> {
string("content")
}
public var createdAt: FieldPath<Temporal.DateTime> {
datetime("createdAt")
}
public var updatedAt: FieldPath<Temporal.DateTime> {
datetime("updatedAt")
}
}
Loading
Loading