Skip to content

Commit c434012

Browse files
committed
test: Add UserTests
1 parent 46cb3d8 commit c434012

File tree

6 files changed

+403
-0
lines changed

6 files changed

+403
-0
lines changed
Lines changed: 284 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,284 @@
1+
using System.Text.Json;
2+
using Microsoft.Playwright.NUnit;
3+
using Microsoft.Playwright;
4+
using PlaywrightTests.Utils;
5+
6+
namespace PlaywrightTests;
7+
8+
public static class TestContext
9+
{
10+
public static string? User1 { get; set; }
11+
public static string? User2 { get; set; }
12+
}
13+
14+
[TestFixture]
15+
public class UserTests : PlaywrightTest
16+
{
17+
private IAPIRequestContext? Request;
18+
static string PROTOCOL = Environment.GetEnvironmentVariable("PROTOCOL") ?? "http";
19+
static string SERVER = Environment.GetEnvironmentVariable("SERVER") ?? "localhost";
20+
static string PORT = Environment.GetEnvironmentVariable("PORT") ?? ":5000";
21+
static string API = Environment.GetEnvironmentVariable("API") ?? "scim";
22+
private static string _baseUrl = $"{PROTOCOL}://{SERVER}{PORT}/{API}/";
23+
24+
[Test, Order(1)]
25+
public async Task PostUser()
26+
{
27+
var data = await JsonLoader.LoadJsonDataAsync("./json/user1.json");
28+
var userResponse = await Request.PostAsync("Users",
29+
new()
30+
{
31+
DataString = data,
32+
Headers = new KeyValuePair<string, string>[] { new("Content-Type", "application/json") }
33+
});
34+
Assert.True(userResponse.Ok);
35+
Assert.That(userResponse.Status, Is.EqualTo(201));
36+
37+
var userJson = await userResponse.JsonAsync();
38+
Assert.True(userJson.HasValue);
39+
Assert.True(userJson!.Value.TryGetProperty("id", out var id));
40+
Assert.That(id.ValueKind, Is.EqualTo(JsonValueKind.String));
41+
TestContext.User1 = id.GetString();
42+
Assert.False(string.IsNullOrWhiteSpace(TestContext.User1));
43+
Assert.Pass($"User with ID '{TestContext.User1}' added!");
44+
}
45+
46+
[Test, Order(1)]
47+
public async Task PostEnterpriseUser()
48+
{
49+
var data = await JsonLoader.LoadJsonDataAsync("./json/user2.json");
50+
var userResponse = await Request.PostAsync("Users",
51+
new()
52+
{
53+
DataString = data,
54+
Headers = new KeyValuePair<string, string>[] { new("Content-Type", "application/json") }
55+
});
56+
Assert.True(userResponse.Ok);
57+
Assert.That(userResponse.Status, Is.EqualTo(201));
58+
59+
var userJson = await userResponse.JsonAsync();
60+
Assert.True(userJson.HasValue);
61+
Assert.True(userJson!.Value.TryGetProperty("id", out var id));
62+
Assert.That(id.ValueKind, Is.EqualTo(JsonValueKind.String));
63+
TestContext.User2 = id.GetString();
64+
Assert.False(string.IsNullOrWhiteSpace(TestContext.User2));
65+
Assert.Pass($"User with ID '{TestContext.User2}' added!");
66+
}
67+
68+
[Test, Order(2)]
69+
public async Task GetUser1()
70+
{
71+
var userResponse = await Request.GetAsync($"Users/{TestContext.User1}");
72+
Assert.True(userResponse.Ok);
73+
Assert.That(userResponse.Status, Is.EqualTo(200));
74+
75+
var userJson = await userResponse.JsonAsync();
76+
Assert.True(userJson.HasValue);
77+
Assert.True(userJson!.Value.TryGetProperty("id", out var id));
78+
Assert.That(id.ValueKind, Is.EqualTo(JsonValueKind.String));
79+
Assert.That(id.ToString(), Is.EqualTo(TestContext.User1));
80+
}
81+
82+
[Test, Order(2)]
83+
public async Task GetUser2()
84+
{
85+
var userResponse = await Request.GetAsync($"Users/{TestContext.User2}");
86+
Assert.True(userResponse.Ok);
87+
Assert.That(userResponse.Status, Is.EqualTo(200));
88+
89+
var userJson = await userResponse.JsonAsync();
90+
Assert.True(userJson.HasValue);
91+
Assert.True(userJson!.Value.TryGetProperty("id", out var id));
92+
Assert.That(id.ValueKind, Is.EqualTo(JsonValueKind.String));
93+
Assert.That(id.ToString(), Is.EqualTo(TestContext.User2));
94+
}
95+
96+
[Test, Order(2)]
97+
public async Task GetUserAttributes()
98+
{
99+
var usersResponse = await Request.GetAsync("Users?attributes=userName,emails");
100+
Assert.True(usersResponse.Ok);
101+
Assert.That(usersResponse.Status, Is.EqualTo(200));
102+
103+
var usersJson = await usersResponse.JsonAsync();
104+
Assert.True(usersJson.HasValue);
105+
Assert.True(usersJson.Value.TryGetProperty("totalResults", out var totalResults));
106+
Assert.That(totalResults.GetInt32(), Is.EqualTo(2));
107+
Assert.True(usersJson.Value.TryGetProperty("Resources", out var resources));
108+
Assert.That(resources.ValueKind, Is.EqualTo(JsonValueKind.Array));
109+
Assert.That(resources.GetArrayLength(), Is.EqualTo(2));
110+
foreach (var resource in resources.EnumerateArray())
111+
{
112+
Assert.True(resource.TryGetProperty("id", out var id));
113+
Assert.That(id.ValueKind, Is.EqualTo(JsonValueKind.String));
114+
var idValue = id.GetString();
115+
Assert.That(idValue, Is.AnyOf([TestContext.User1, TestContext.User2]));
116+
}
117+
}
118+
119+
[Test, Order(2)]
120+
public async Task GetUserFilters()
121+
{
122+
var usersResponse = await Request.GetAsync("Users/?filter=DisplayName+eq+%22BobIsAmazing%22");
123+
Assert.True(usersResponse.Ok);
124+
Assert.That(usersResponse.Status, Is.EqualTo(200));
125+
126+
var usersJson = await usersResponse.JsonAsync();
127+
Assert.True(usersJson.HasValue);
128+
Assert.True(usersJson.Value.TryGetProperty("totalResults", out var totalResults));
129+
Assert.That(totalResults.GetInt32(), Is.EqualTo(1));
130+
Assert.True(usersJson.Value.TryGetProperty("Resources", out var resources));
131+
Assert.That(resources.ValueKind, Is.EqualTo(JsonValueKind.Array));
132+
Assert.That(resources.GetArrayLength(), Is.EqualTo(1));
133+
foreach (var resource in resources.EnumerateArray())
134+
{
135+
Assert.True(resource.TryGetProperty("id", out var id));
136+
Assert.That(id.ValueKind, Is.EqualTo(JsonValueKind.String));
137+
var idValue = id.GetString();
138+
Assert.That(idValue, Is.EqualTo(TestContext.User1));
139+
}
140+
}
141+
142+
[Test, Order(3)]
143+
public async Task PatchUser1()
144+
{
145+
var data = await JsonLoader.LoadJsonDataAsync("./json/patch_user1.json");
146+
var patchResponse = await Request.PatchAsync($"Users/{TestContext.User1}", new()
147+
{
148+
DataString = data,
149+
Headers = new KeyValuePair<string, string>[] { new("Content-Type", "application/json") }
150+
});
151+
Assert.True(patchResponse.Ok);
152+
Assert.That(patchResponse.Status, Is.EqualTo(200));
153+
154+
var userJson = await patchResponse.JsonAsync();
155+
Assert.True(userJson.HasValue);
156+
Assert.True(userJson!.Value.TryGetProperty("id", out var id));
157+
Assert.That(id.ToString(), Is.EqualTo(TestContext.User1));
158+
Assert.True(userJson.Value.TryGetProperty("userName", out var userName));
159+
Assert.That(userName.GetString(), Is.EqualTo("ryan3"));
160+
}
161+
162+
[Test, Order(4)]
163+
public async Task CheckUser1Patch()
164+
{
165+
var patchResponse = await Request.GetAsync($"Users/{TestContext.User1}");
166+
Assert.True(patchResponse.Ok);
167+
Assert.That(patchResponse.Status, Is.EqualTo(200));
168+
169+
var userJson = await patchResponse.JsonAsync();
170+
Assert.True(userJson.HasValue);
171+
Assert.True(userJson!.Value.TryGetProperty("id", out var id));
172+
Assert.That(id.ToString(), Is.EqualTo(TestContext.User1));
173+
Assert.True(userJson.Value.TryGetProperty("userName", out var userName));
174+
Assert.That(userName.GetString(), Is.EqualTo("ryan3"));
175+
}
176+
177+
[Test, Order(4)]
178+
public async Task PutUser2()
179+
{
180+
Assert.False(string.IsNullOrWhiteSpace(TestContext.User2));
181+
var data = await JsonLoader.LoadJsonDataAsync("./json/put_user2.json", "id2", TestContext.User2!);
182+
var putResponse = await Request.PutAsync($"Users/{TestContext.User2}",
183+
new()
184+
{
185+
DataString = data,
186+
Headers = new KeyValuePair<string, string>[] { new("Content-Type", "application/json") }
187+
});
188+
Assert.True(putResponse.Ok);
189+
Assert.That(putResponse.Status, Is.EqualTo(200));
190+
191+
var userJson = await putResponse.JsonAsync();
192+
Assert.True(userJson.HasValue);
193+
Assert.True(userJson!.Value.TryGetProperty("id", out var id));
194+
Assert.That(id.ToString(), Is.EqualTo(TestContext.User2));
195+
Assert.True(userJson.Value.TryGetProperty("userName", out var userName));
196+
Assert.That(userName.GetString(), Is.EqualTo("UserNameReplace2"));
197+
}
198+
199+
[Test, Order(5)]
200+
public async Task CheckUser2Put()
201+
{
202+
Assert.False(string.IsNullOrWhiteSpace(TestContext.User2));
203+
var userResponse = await Request.GetAsync($"Users/{TestContext.User2}");
204+
Assert.True(userResponse.Ok);
205+
Assert.That(userResponse.Status, Is.EqualTo(200));
206+
207+
var userJson = await userResponse.JsonAsync();
208+
Assert.True(userJson.HasValue);
209+
Assert.True(userJson!.Value.TryGetProperty("id", out var id));
210+
Assert.That(id.ToString(), Is.EqualTo(TestContext.User2));
211+
Assert.True(userJson.Value.TryGetProperty("userName", out var userName));
212+
Assert.That(userName.GetString(), Is.EqualTo("UserNameReplace2"));
213+
}
214+
215+
[SetUp]
216+
public async Task SetUpApiTesting()
217+
{
218+
await CreateApiRequestContext();
219+
await GetAccessToken();
220+
}
221+
222+
private async Task CreateApiRequestContext()
223+
{
224+
// Assuming personal access token available in the environment.
225+
226+
Request = await this.Playwright.APIRequest.NewContextAsync(new()
227+
{
228+
// All requests we send go to this API endpoint.
229+
BaseURL = _baseUrl,
230+
});
231+
}
232+
233+
private async Task GetAccessToken()
234+
{
235+
var headers = new Dictionary<string, string>();
236+
var response = await Request.GetAsync("Token");
237+
Assert.True(response.Ok);
238+
239+
var tokenJsonResponse = response.JsonAsync().Result;
240+
if (!tokenJsonResponse.HasValue)
241+
{
242+
throw new Exception("No token found in response.");
243+
}
244+
245+
if (tokenJsonResponse.Value.TryGetProperty("token", out var token) == true)
246+
{
247+
if (token.ValueKind == JsonValueKind.String)
248+
{
249+
// Add authorization token to all requests.
250+
// Assuming personal access token available in the environment.
251+
headers.Add("Authorization", $"Bearer {token}");
252+
await Request.DisposeAsync();
253+
Request = await this.Playwright.APIRequest.NewContextAsync(new()
254+
{
255+
// All requests we send go to this API endpoint.
256+
BaseURL = _baseUrl,
257+
ExtraHTTPHeaders = headers
258+
});
259+
}
260+
}
261+
}
262+
263+
[Test]
264+
public async Task DeleteUser1()
265+
{
266+
var userResponse = await Request.DeleteAsync($"Users/{TestContext.User1}");
267+
Assert.True(userResponse.Ok);
268+
Assert.That(userResponse.Status, Is.EqualTo(204));
269+
}
270+
271+
[Test]
272+
public async Task DeleteUser2()
273+
{
274+
var userResponse = await Request.DeleteAsync($"Users/{TestContext.User2}");
275+
Assert.True(userResponse.Ok);
276+
Assert.That(userResponse.Status, Is.EqualTo(204));
277+
}
278+
279+
[TearDown]
280+
public async Task TearDownAPITesting()
281+
{
282+
await Request.DisposeAsync();
283+
}
284+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
namespace PlaywrightTests.Utils;
2+
3+
public class JsonLoader
4+
{
5+
public static async Task<string> LoadJsonDataAsync(string filePath, string variable, string value)
6+
{
7+
// Read the content of the JSON file
8+
string jsonContent = await File.ReadAllTextAsync(filePath);
9+
10+
// Replace the placeholder with the actual value
11+
jsonContent = jsonContent.Replace("{{" + variable + "}}", value);
12+
13+
// Parse the JSON content into a dynamic object
14+
return jsonContent;
15+
}
16+
17+
public static async Task<string> LoadJsonDataAsync(string filePath)
18+
{
19+
// Read the content of the JSON file
20+
return await File.ReadAllTextAsync(filePath);
21+
}
22+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"schemas": [
3+
"urn:ietf:params:scim:api:messages:2.0:PatchOp"
4+
],
5+
"Operations": [
6+
{
7+
"op": "replace",
8+
"path": "userName",
9+
"value": "ryan3"
10+
}
11+
]
12+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"userName": "UserNameReplace2",
3+
"active": true,
4+
"displayName": "BobIsAmazing",
5+
"schemas": [
6+
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User",
7+
"urn:ietf:params:scim:schemas:core:2.0:User"
8+
],
9+
"id": "{{id2}}",
10+
"externalId": "${__UUID}",
11+
"name": {
12+
"formatted": "NewName",
13+
"familyName": "Leenay",
14+
"givenName": "Ryan"
15+
},
16+
"emails": [
17+
{
18+
"Primary": true,
19+
"type": "work",
20+
"value": "[email protected]"
21+
},
22+
{
23+
"Primary": false,
24+
"type": "home",
25+
"value": "[email protected]"
26+
}
27+
]
28+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"userName": "UserName123",
3+
"active": true,
4+
"displayName": "BobIsAmazing",
5+
"schemas": [
6+
"urn:ietf:params:scim:schemas:core:2.0:User"
7+
],
8+
"externalId": "${__UUID}",
9+
"name": {
10+
"formatted": "Ryan Leenay",
11+
"familyName": "Leenay",
12+
"givenName": "Ryan"
13+
},
14+
"emails": [
15+
{
16+
"Primary": true,
17+
"type": "work",
18+
"value": "[email protected]"
19+
},
20+
{
21+
"Primary": false,
22+
"type": "home",
23+
"value": "[email protected]"
24+
}
25+
]
26+
}

0 commit comments

Comments
 (0)