amplify-swift/AmplifyPlugins/API/Tests/AWSAPIPluginTests/Core/AppSyncModelMetadataTests.s...

179 lines
6.3 KiB
Swift

//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
import XCTest
import AmplifyTestCommon
@testable import Amplify
@testable import AWSAPIPlugin
class ModelMetadataTests: XCTestCase {
override func setUp() {
ModelRegistry.register(modelType: Comment4.self)
ModelRegistry.register(modelType: Post4.self)
}
override class func tearDown() {
ModelRegistry.reset()
}
func testShouldAddMetadataTrue() {
let model: JSONValue = [
"id": "id",
"__typename": "Post4"
]
XCTAssertTrue(AppSyncModelMetadataUtils.shouldAddMetadata(toModel: model))
}
func testShouldAddMetadataFalse_MissingTypename() {
let model: JSONValue = [
"id": "id"
]
XCTAssertFalse(AppSyncModelMetadataUtils.shouldAddMetadata(toModel: model))
}
func testShouldAddMetadataFalse_MissingId() {
let model: JSONValue = [
"__typename": "Post4"
]
XCTAssertFalse(AppSyncModelMetadataUtils.shouldAddMetadata(toModel: model))
}
func testShouldAddMetadataFalse_InvalidTypeName() {
let model: JSONValue = [
"__typename": "InvalidName"
]
XCTAssertFalse(AppSyncModelMetadataUtils.shouldAddMetadata(toModel: model))
}
func testAddMetadataToModelArraySuccess() {
let jsonArray: [JSONValue] = [
[
"id": "postId",
"title": JSONValue.init(stringLiteral: "title"),
"__typename": "Post4"
], [
"id": "postId",
"title": JSONValue.init(stringLiteral: "title"),
"__typename": "Post4"
]
]
let posts = AppSyncModelMetadataUtils.addMetadata(toModelArray: jsonArray, apiName: "apiName")
XCTAssertEqual(posts.count, 2)
for post in posts {
guard case .object(let associationData) = post["comments"],
case .string(let associatedField) = associationData["appSyncAssociatedField"],
case .string(let associatedId) = associationData["appSyncAssociatedId"],
case .string(let apiName) = associationData["apiName"] else {
XCTFail("Missing association metadata for comments")
return
}
XCTAssertEqual(associatedId, "postId")
XCTAssertEqual(associatedField, "post")
XCTAssertEqual(apiName, "apiName")
}
}
func testAddMetadataToModelSuccess() {
let json: JSONValue = [
"id": "postId",
"title": JSONValue.init(stringLiteral: "title"),
"__typename": "Post4"
]
let post = AppSyncModelMetadataUtils.addMetadata(toModel: json, apiName: "apiName")
guard case .object(let associationData) = post["comments"],
case .string(let associatedField) = associationData["appSyncAssociatedField"],
case .string(let associatedId) = associationData["appSyncAssociatedId"],
case .string(let apiName) = associationData["apiName"] else {
XCTFail("Missing association metadata for comments")
return
}
XCTAssertEqual(associatedId, "postId")
XCTAssertEqual(associatedField, "post")
XCTAssertEqual(apiName, "apiName")
}
func testAddMetadataToModelNoOp_NotAnObject() {
let json: JSONValue = "notAnObject"
let result = AppSyncModelMetadataUtils.addMetadata(toModel: json, apiName: "apiName")
XCTAssertEqual(result, "notAnObject")
}
func testAddMetadatToModelNoOp_MissingTypename() {
let json: JSONValue = [
"id": "postId",
"title": JSONValue.init(stringLiteral: "title")
]
let post = AppSyncModelMetadataUtils.addMetadata(toModel: json, apiName: "apiName")
guard case .object(let postObject) = post,
case .string = postObject["id"],
case .string = postObject["title"] else {
XCTFail("Should have exactly the number of fields in original json object")
return
}
XCTAssertEqual(postObject.count, 2)
}
func testAddMetadataToModelNoOp_MissingModelSchema() {
let json: JSONValue = [
"id": "postId",
"title": JSONValue.init(stringLiteral: "title"),
"__typename": "InvalidModelName"
]
let post = AppSyncModelMetadataUtils.addMetadata(toModel: json, apiName: "apiName")
guard case .object(let postObject) = post,
case .string = postObject["id"],
case .string = postObject["title"],
case .string = postObject["__typename"] else {
XCTFail("Should have exactly the number of fields in original json object")
return
}
XCTAssertEqual(postObject.count, 3)
}
func testAddMetadataNoOp_MissingId() {
let json: JSONValue = [
"title": JSONValue.init(stringLiteral: "title"),
"__typename": "Post4"
]
let post = AppSyncModelMetadataUtils.addMetadata(toModel: json, apiName: "apiName")
guard case .object(let postObject) = post,
case .string = postObject["title"],
case .string = postObject["__typename"] else {
XCTFail("Should have exactly the number of fields in original json object")
return
}
XCTAssertEqual(postObject.count, 2)
}
func testAddMetadataNoOp_NestedDataAtArrayAssociation() {
let json: JSONValue = [
"id": "postId",
"title": JSONValue.init(stringLiteral: "title"),
"__typename": "Post4",
"comments": [
"items": [
["id": "commentId", "content": "content"]
],
"nextToken": "nextToken"
]
]
let post = AppSyncModelMetadataUtils.addMetadata(toModel: json, apiName: "apiName")
guard case .object(let associationData) = post["comments"],
associationData["appSyncAssociatedField"] == nil,
associationData["appSyncAssociatedId"] == nil,
associationData["apiName"] == nil else {
XCTFail("Nested levels of data should not have metadata added")
return
}
}
}