Skip to content

Commit f04ec26

Browse files
committed
more stuff
1 parent 0812983 commit f04ec26

File tree

6 files changed

+1050
-55
lines changed

6 files changed

+1050
-55
lines changed

test/OpenApiNSwagEndToEndTests/ModelStateValidation/ModelStateValidationTests.cs

+131-38
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public ModelStateValidationTests(IntegrationTestContext<OpenApiStartup<ModelStat
2626
}
2727

2828
[Fact]
29-
public async Task xxx()
29+
public async Task Cannot_violate_compare_constraint()
3030
{
3131
// Arrange
3232
SocialMediaAccount socialMediaAccount = _fakers.SocialMediaAccount.Generate();
@@ -39,23 +39,66 @@ public async Task xxx()
3939
{
4040
Data = new SocialMediaAccountDataInPostRequest
4141
{
42-
Attributes = new SocialMediaAccountAttributesInPostRequest()
42+
Attributes = new SocialMediaAccountAttributesInPostRequest
43+
{
44+
FirstName = socialMediaAccount.FirstName,
45+
GivenName = "something else",
46+
LastName = ""
47+
}
48+
}
49+
});
50+
51+
// Assert
52+
ErrorResponseDocument document = (await action.Should().ThrowExactlyAsync<ApiException<ErrorResponseDocument>>()).Which.Result;
53+
document.Errors.ShouldHaveCount(1);
54+
55+
ErrorObject errorObject = document.Errors.First();
56+
errorObject.Title.Should().Be("Input validation failed.");
57+
errorObject.Detail.Should().Be("'GivenName' and 'FirstName' do not match.");
58+
errorObject.Source.ShouldNotBeNull();
59+
errorObject.Source.Pointer.Should().Be("/data/attributes/givenName");
60+
}
61+
62+
[Theory]
63+
[InlineData("a")]
64+
[InlineData("abcdefghijklmnopqrstu")]
65+
public async Task Cannot_exceed_length_constraint(string firstName)
66+
{
67+
// Arrange
68+
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
69+
ModelStateValidationClient apiClient = new(httpClient);
70+
71+
// Act
72+
Func<Task<SocialMediaAccountPrimaryResponseDocument>> action = () => apiClient.PostSocialMediaAccountAsync(new SocialMediaAccountPostRequestDocument
73+
{
74+
Data = new SocialMediaAccountDataInPostRequest
75+
{
76+
Attributes = new SocialMediaAccountAttributesInPostRequest
77+
{
78+
FirstName = firstName,
79+
GivenName = firstName,
80+
LastName = ""
81+
}
4382
}
4483
});
4584

4685
// Assert
47-
ExceptionAssertions<JsonSerializationException> assertion = await action.Should().ThrowExactlyAsync<JsonSerializationException>();
48-
assertion.Which.Message.Should().Be("Cannot write a null value for property 'lastName'. Property requires a value. Path 'data.attributes'.");
86+
ErrorResponseDocument document = (await action.Should().ThrowExactlyAsync<ApiException<ErrorResponseDocument>>()).Which.Result;
87+
document.Errors.ShouldHaveCount(1);
88+
89+
ErrorObject errorObject = document.Errors.First();
90+
errorObject.Title.Should().Be("Input validation failed.");
91+
errorObject.Detail.Should().Be("The field FirstName must be a string or collection type with a minimum length of '2' and maximum length of '20'.");
92+
errorObject.Source.ShouldNotBeNull();
93+
errorObject.Source.Pointer.Should().Be("/data/attributes/firstName");
4994
}
5095

5196
[Theory]
5297
[InlineData("ab")]
5398
[InlineData("abcdefghijklmnopqrs")]
54-
public async Task Cannot_exceed_length_constraint(string userName)
99+
public async Task Cannot_exceed_string_length_constraint(string userName)
55100
{
56101
// Arrange
57-
SocialMediaAccount socialMediaAccount = _fakers.SocialMediaAccount.Generate();
58-
59102
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
60103
ModelStateValidationClient apiClient = new(httpClient);
61104

@@ -66,8 +109,8 @@ public async Task Cannot_exceed_length_constraint(string userName)
66109
{
67110
Attributes = new SocialMediaAccountAttributesInPostRequest
68111
{
69-
LastName = socialMediaAccount.LastName,
70-
UserName = userName
112+
LastName = "",
113+
UserName = userName,
71114
}
72115
}
73116
});
@@ -87,8 +130,6 @@ public async Task Cannot_exceed_length_constraint(string userName)
87130
public async Task Cannot_violate_regular_expression_constraint()
88131
{
89132
// Arrange
90-
SocialMediaAccount socialMediaAccount = _fakers.SocialMediaAccount.Generate();
91-
92133
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
93134
ModelStateValidationClient apiClient = new(httpClient);
94135

@@ -99,8 +140,8 @@ public async Task Cannot_violate_regular_expression_constraint()
99140
{
100141
Attributes = new SocialMediaAccountAttributesInPostRequest
101142
{
102-
LastName = socialMediaAccount.LastName,
103-
UserName = "aB1"
143+
LastName = "",
144+
UserName = "aB1",
104145
}
105146
}
106147
});
@@ -120,8 +161,6 @@ public async Task Cannot_violate_regular_expression_constraint()
120161
public async Task Cannot_use_invalid_credit_card()
121162
{
122163
// Arrange
123-
SocialMediaAccount socialMediaAccount = _fakers.SocialMediaAccount.Generate();
124-
125164
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
126165
ModelStateValidationClient apiClient = new(httpClient);
127166

@@ -132,8 +171,8 @@ public async Task Cannot_use_invalid_credit_card()
132171
{
133172
Attributes = new SocialMediaAccountAttributesInPostRequest
134173
{
135-
LastName = socialMediaAccount.LastName,
136-
CreditCard = "123-456"
174+
LastName = "",
175+
CreditCard = "123-456",
137176
}
138177
}
139178
});
@@ -153,8 +192,6 @@ public async Task Cannot_use_invalid_credit_card()
153192
public async Task Cannot_use_invalid_email()
154193
{
155194
// Arrange
156-
SocialMediaAccount socialMediaAccount = _fakers.SocialMediaAccount.Generate();
157-
158195
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
159196
ModelStateValidationClient apiClient = new(httpClient);
160197

@@ -165,8 +202,8 @@ public async Task Cannot_use_invalid_email()
165202
{
166203
Attributes = new SocialMediaAccountAttributesInPostRequest
167204
{
168-
LastName = socialMediaAccount.LastName,
169-
Email = "abc"
205+
LastName = "",
206+
Email = "abc",
170207
}
171208
}
172209
});
@@ -190,8 +227,6 @@ public async Task Cannot_use_invalid_email()
190227
public async Task Cannot_use_double_outside_of_valid_range(int age)
191228
{
192229
// Arrange
193-
SocialMediaAccount socialMediaAccount = _fakers.SocialMediaAccount.Generate();
194-
195230
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
196231
ModelStateValidationClient apiClient = new(httpClient);
197232

@@ -202,8 +237,8 @@ public async Task Cannot_use_double_outside_of_valid_range(int age)
202237
{
203238
Attributes = new SocialMediaAccountAttributesInPostRequest
204239
{
205-
LastName = socialMediaAccount.LastName,
206-
Age = age
240+
LastName = "",
241+
Age = age,
207242
}
208243
}
209244
});
@@ -214,7 +249,7 @@ public async Task Cannot_use_double_outside_of_valid_range(int age)
214249

215250
ErrorObject errorObject = document.Errors.First();
216251
errorObject.Title.Should().Be("Input validation failed.");
217-
errorObject.Detail.Should().Be("The field Age must be between 0 and 123.");
252+
errorObject.Detail.Should().Be("The field Age must be between 0.1 and 122.9.");
218253
errorObject.Source.ShouldNotBeNull();
219254
errorObject.Source.Pointer.Should().Be("/data/attributes/age");
220255
}
@@ -223,8 +258,6 @@ public async Task Cannot_use_double_outside_of_valid_range(int age)
223258
public async Task Cannot_use_invalid_url()
224259
{
225260
// Arrange
226-
SocialMediaAccount socialMediaAccount = _fakers.SocialMediaAccount.Generate();
227-
228261
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
229262
ModelStateValidationClient apiClient = new(httpClient);
230263

@@ -235,8 +268,8 @@ public async Task Cannot_use_invalid_url()
235268
{
236269
Attributes = new SocialMediaAccountAttributesInPostRequest
237270
{
238-
LastName = socialMediaAccount.LastName,
239-
BackgroundPicture = new Uri("/justapath", UriKind.Relative)
271+
LastName = "",
272+
BackgroundPicture = new Uri("/justapath", UriKind.Relative),
240273
}
241274
}
242275
});
@@ -253,11 +286,40 @@ public async Task Cannot_use_invalid_url()
253286
}
254287

255288
[Fact]
256-
public async Task Cannot_use_TimeSpan_outside_of_valid_range()
289+
public async Task Cannot_use_non_allowed_value()
257290
{
258291
// Arrange
259-
SocialMediaAccount socialMediaAccount = _fakers.SocialMediaAccount.Generate();
292+
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
293+
ModelStateValidationClient apiClient = new(httpClient);
294+
295+
// Act
296+
Func<Task<SocialMediaAccountPrimaryResponseDocument>> action = () => apiClient.PostSocialMediaAccountAsync(new SocialMediaAccountPostRequestDocument
297+
{
298+
Data = new SocialMediaAccountDataInPostRequest
299+
{
300+
Attributes = new SocialMediaAccountAttributesInPostRequest
301+
{
302+
LastName = "",
303+
CountryCode = "US"
304+
}
305+
}
306+
});
307+
308+
// Assert
309+
ErrorResponseDocument document = (await action.Should().ThrowExactlyAsync<ApiException<ErrorResponseDocument>>()).Which.Result;
310+
document.Errors.ShouldHaveCount(1);
311+
312+
ErrorObject errorObject = document.Errors.First();
313+
errorObject.Title.Should().Be("Input validation failed.");
314+
errorObject.Detail.Should().Be("The CountryCode field does not equal any of the values specified in AllowedValuesAttribute.");
315+
errorObject.Source.ShouldNotBeNull();
316+
errorObject.Source.Pointer.Should().Be("/data/attributes/countryCode");
317+
}
260318

319+
[Fact]
320+
public async Task Cannot_use_denied_value()
321+
{
322+
// Arrange
261323
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
262324
ModelStateValidationClient apiClient = new(httpClient);
263325

@@ -268,8 +330,39 @@ public async Task Cannot_use_TimeSpan_outside_of_valid_range()
268330
{
269331
Attributes = new SocialMediaAccountAttributesInPostRequest
270332
{
271-
LastName = socialMediaAccount.LastName,
272-
NextRevalidation = "00:00:01"
333+
LastName = "",
334+
Planet = "pluto"
335+
}
336+
}
337+
});
338+
339+
// Assert
340+
ErrorResponseDocument document = (await action.Should().ThrowExactlyAsync<ApiException<ErrorResponseDocument>>()).Which.Result;
341+
document.Errors.ShouldHaveCount(1);
342+
343+
ErrorObject errorObject = document.Errors.First();
344+
errorObject.Title.Should().Be("Input validation failed.");
345+
errorObject.Detail.Should().Be("The Planet field equals one of the values specified in DeniedValuesAttribute.");
346+
errorObject.Source.ShouldNotBeNull();
347+
errorObject.Source.Pointer.Should().Be("/data/attributes/planet");
348+
}
349+
350+
[Fact]
351+
public async Task Cannot_use_TimeSpan_outside_of_valid_range()
352+
{
353+
// Arrange
354+
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
355+
ModelStateValidationClient apiClient = new(httpClient);
356+
357+
// Act
358+
Func<Task<SocialMediaAccountPrimaryResponseDocument>> action = () => apiClient.PostSocialMediaAccountAsync(new SocialMediaAccountPostRequestDocument
359+
{
360+
Data = new SocialMediaAccountDataInPostRequest
361+
{
362+
Attributes = new SocialMediaAccountAttributesInPostRequest
363+
{
364+
LastName = "",
365+
NextRevalidation = "00:00:01",
273366
}
274367
}
275368
});
@@ -289,8 +382,6 @@ public async Task Cannot_use_TimeSpan_outside_of_valid_range()
289382
public async Task Cannot_use_invalid_TimeOnly()
290383
{
291384
// Arrange
292-
SocialMediaAccount socialMediaAccount = _fakers.SocialMediaAccount.Generate();
293-
294385
using HttpClient httpClient = _testContext.Factory.CreateDefaultClient(_logHttpMessageHandler);
295386
ModelStateValidationClient apiClient = new(httpClient);
296387

@@ -301,8 +392,8 @@ public async Task Cannot_use_invalid_TimeOnly()
301392
{
302393
Attributes = new SocialMediaAccountAttributesInPostRequest
303394
{
304-
LastName = socialMediaAccount.LastName,
305-
ValidatedAtTime = TimeSpan.FromSeconds(-1)
395+
LastName = "",
396+
ValidatedAtTime = TimeSpan.FromSeconds(-1),
306397
}
307398
}
308399
});
@@ -344,6 +435,8 @@ public async Task Can_create_resource_with_valid_properties()
344435
Age = socialMediaAccount.Age,
345436
ProfilePicture = socialMediaAccount.ProfilePicture,
346437
BackgroundPicture = new Uri(socialMediaAccount.BackgroundPicture!),
438+
Tags = socialMediaAccount.Tags,
439+
Planet = socialMediaAccount.Planet,
347440
NextRevalidation = "02:00:00",
348441
ValidatedAt = socialMediaAccount.ValidatedAt!,
349442
ValidatedAtDate = new DateTimeOffset(socialMediaAccount.ValidatedAtDate!.Value.ToDateTime(new TimeOnly()).ToUniversalTime()),

0 commit comments

Comments
 (0)