-
Notifications
You must be signed in to change notification settings - Fork 369
Expand file tree
/
Copy pathGraphQLUtilsTests.cs
More file actions
158 lines (137 loc) · 6.34 KB
/
Copy pathGraphQLUtilsTests.cs
File metadata and controls
158 lines (137 loc) · 6.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System.Collections.Generic;
using Azure.DataApiBuilder.Config.ObjectModel;
using Azure.DataApiBuilder.Service.Exceptions;
using Azure.DataApiBuilder.Service.GraphQLBuilder;
using HotChocolate.Language;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Azure.DataApiBuilder.Service.Tests.GraphQLBuilder
{
/// <summary>
/// Unit tests for the pure static helpers in <see cref="GraphQLUtils"/>.
/// </summary>
[TestClass]
public class GraphQLUtilsTests
{
[DataTestMethod]
[DataRow(DatabaseType.MSSQL, true)]
[DataRow(DatabaseType.MySQL, true)]
[DataRow(DatabaseType.DWSQL, true)]
[DataRow(DatabaseType.PostgreSQL, true)]
[DataRow(DatabaseType.CosmosDB_PostgreSQL, true)]
[DataRow(DatabaseType.CosmosDB_NoSQL, false)]
public void IsRelationalDb(DatabaseType databaseType, bool expected)
{
Assert.AreEqual(expected, GraphQLUtils.IsRelationalDb(databaseType));
}
[DataTestMethod]
[DataRow("String", true)]
[DataRow("Int", true)]
[DataRow("Boolean", true)]
[DataRow("ID", true)]
[DataRow("Book", false)]
[DataRow("CustomType", false)]
public void IsBuiltInType(string typeName, bool expected)
{
ITypeNode typeNode = new NamedTypeNode(new NameNode(typeName));
Assert.AreEqual(expected, GraphQLUtils.IsBuiltInType(typeNode));
}
[TestMethod]
public void IsModelType_WithModelDirective_ReturnsTrue()
{
ObjectTypeDefinitionNode node = ParseObjectType(@"type Book @model(name: ""Book"") { id: Int }");
Assert.IsTrue(GraphQLUtils.IsModelType(node));
}
[TestMethod]
public void IsModelType_WithoutModelDirective_ReturnsFalse()
{
ObjectTypeDefinitionNode node = ParseObjectType("type Book { id: Int }");
Assert.IsFalse(GraphQLUtils.IsModelType(node));
}
[TestMethod]
public void FindPrimaryKeyFields_CosmosNoSql_ReturnsIdAndPartitionKey()
{
ObjectTypeDefinitionNode node = ParseObjectType("type Book { title: String }");
List<FieldDefinitionNode> pkFields = GraphQLUtils.FindPrimaryKeyFields(node, DatabaseType.CosmosDB_NoSQL);
Assert.AreEqual(2, pkFields.Count);
CollectionAssert.AreEquivalent(
new[] { GraphQLUtils.DEFAULT_PRIMARY_KEY_NAME, GraphQLUtils.DEFAULT_PARTITION_KEY_NAME },
pkFields.ConvertAll(f => f.Name.Value));
}
[TestMethod]
public void FindPrimaryKeyFields_PrimaryKeyDirective_ReturnsDirectiveField()
{
ObjectTypeDefinitionNode node = ParseObjectType("type Book { book_id: Int @primaryKey title: String }");
List<FieldDefinitionNode> pkFields = GraphQLUtils.FindPrimaryKeyFields(node, DatabaseType.MSSQL);
Assert.AreEqual(1, pkFields.Count);
Assert.AreEqual("book_id", pkFields[0].Name.Value);
}
[TestMethod]
public void FindPrimaryKeyFields_NoDirective_FallsBackToIdField()
{
ObjectTypeDefinitionNode node = ParseObjectType("type Book { id: Int title: String }");
List<FieldDefinitionNode> pkFields = GraphQLUtils.FindPrimaryKeyFields(node, DatabaseType.MSSQL);
Assert.AreEqual(1, pkFields.Count);
Assert.AreEqual("id", pkFields[0].Name.Value);
}
[TestMethod]
public void FindPrimaryKeyFields_NoDirectiveNoIdField_Throws()
{
ObjectTypeDefinitionNode node = ParseObjectType("type Book { title: String }");
DataApiBuilderException ex = Assert.ThrowsException<DataApiBuilderException>(
() => GraphQLUtils.FindPrimaryKeyFields(node, DatabaseType.MSSQL));
Assert.AreEqual(DataApiBuilderException.SubStatusCodes.ErrorInInitialization, ex.SubStatusCode);
}
[TestMethod]
public void IsAutoGeneratedField_WithDirective_ReturnsTrue()
{
ObjectTypeDefinitionNode node = ParseObjectType("type Book { id: Int @autoGenerated }");
Assert.IsTrue(GraphQLUtils.IsAutoGeneratedField(node.Fields[0]));
}
[TestMethod]
public void IsAutoGeneratedField_WithoutDirective_ReturnsFalse()
{
ObjectTypeDefinitionNode node = ParseObjectType("type Book { id: Int }");
Assert.IsFalse(GraphQLUtils.IsAutoGeneratedField(node.Fields[0]));
}
[TestMethod]
public void CreateAuthorizationDirective_NullRoles_ReturnsFalse()
{
bool created = GraphQLUtils.CreateAuthorizationDirectiveIfNecessary(null, out DirectiveNode? directive);
Assert.IsFalse(created);
Assert.IsNull(directive);
}
[TestMethod]
public void CreateAuthorizationDirective_EmptyRoles_ReturnsFalse()
{
bool created = GraphQLUtils.CreateAuthorizationDirectiveIfNecessary(new List<string>(), out DirectiveNode? directive);
Assert.IsFalse(created);
Assert.IsNull(directive);
}
[TestMethod]
public void CreateAuthorizationDirective_ContainsAnonymous_ReturnsFalse()
{
bool created = GraphQLUtils.CreateAuthorizationDirectiveIfNecessary(
new[] { "role1", GraphQLUtils.SYSTEM_ROLE_ANONYMOUS }, out DirectiveNode? directive);
Assert.IsFalse(created);
Assert.IsNull(directive);
}
[TestMethod]
public void CreateAuthorizationDirective_WithRoles_ReturnsAuthorizeDirective()
{
bool created = GraphQLUtils.CreateAuthorizationDirectiveIfNecessary(
new[] { "role1", "role2" }, out DirectiveNode? directive);
Assert.IsTrue(created);
Assert.IsNotNull(directive);
Assert.AreEqual(GraphQLUtils.AUTHORIZE_DIRECTIVE, directive!.Name.Value);
Assert.AreEqual(1, directive.Arguments.Count);
Assert.AreEqual(GraphQLUtils.AUTHORIZE_DIRECTIVE_ARGUMENT_ROLES, directive.Arguments[0].Name.Value);
}
private static ObjectTypeDefinitionNode ParseObjectType(string sdl)
{
DocumentNode document = Utf8GraphQLParser.Parse(sdl);
return (ObjectTypeDefinitionNode)document.Definitions[0];
}
}
}