public async Task When_patching_resource_with_multiple_self_references_it_must_succeed() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = false }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); await dbContext.SaveChangesAsync(); }); var content = new { data = new { type = "systemDirectories", id = directory.StringId, attributes = new Dictionary <string, object> { ["name"] = "Project files" }, relationships = new Dictionary <string, object> { ["self"] = new { data = new { type = "systemDirectories", id = directory.StringId } }, ["alsoSelf"] = new { data = new { type = "systemDirectories", id = directory.StringId } } } } }; string requestBody = JsonConvert.SerializeObject(content); string route = "/systemDirectories/" + directory.StringId; // Act var(httpResponse, responseDocument) = await _testContext.ExecutePatchAsync <Document>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); responseDocument.Data.Should().BeNull(); }
public async Task Can_update_resource_with_multiple_self_references() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = false }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new { type = "systemDirectories", id = directory.StringId, attributes = new { name = "Project files" }, relationships = new { self = new { data = new { type = "systemDirectories", id = directory.StringId } }, alsoSelf = new { data = new { type = "systemDirectories", id = directory.StringId } } } } }; string route = "/systemDirectories/" + directory.StringId; // Act (HttpResponseMessage httpResponse, string responseDocument) = await _testContext.ExecutePatchAsync <string>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent); responseDocument.Should().BeEmpty(); }
public async Task When_patching_annotated_ToMany_relationship_it_must_succeed() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true, Files = new List <SystemFile> { new SystemFile { FileName = "Main.cs" }, new SystemFile { FileName = "Program.cs" } } }; var otherFile = new SystemFile { FileName = "EntryPoint.cs" }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); dbContext.Files.Add(otherFile); await dbContext.SaveChangesAsync(); }); var content = new { data = new[] { new { type = "systemFiles", id = otherFile.StringId } } }; string requestBody = JsonConvert.SerializeObject(content); string route = "/systemDirectories/" + directory.StringId + "/relationships/files"; // Act var(httpResponse, responseDocument) = await _testContext.ExecutePatchAsync <Document>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); responseDocument.Data.Should().BeNull(); }
public async Task Can_replace_annotated_ToMany_relationship() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true, Files = new List <SystemFile> { new SystemFile { FileName = "Main.cs" }, new SystemFile { FileName = "Program.cs" } } }; var otherFile = new SystemFile { FileName = "EntryPoint.cs" }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); dbContext.Files.Add(otherFile); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new[] { new { type = "systemFiles", id = otherFile.StringId } } }; string route = "/systemDirectories/" + directory.StringId + "/relationships/files"; // Act (HttpResponseMessage httpResponse, string responseDocument) = await _testContext.ExecutePatchAsync <string>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent); responseDocument.Should().BeEmpty(); }
public async Task When_patching_annotated_ToOne_relationship_it_must_succeed() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true, Parent = new SystemDirectory { Name = "Data", IsCaseSensitive = true } }; var otherParent = new SystemDirectory { Name = "Data files", IsCaseSensitive = true }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.AddRange(directory, otherParent); await dbContext.SaveChangesAsync(); }); var content = new { data = new { type = "systemDirectories", id = otherParent.StringId } }; string requestBody = JsonConvert.SerializeObject(content); string route = "/systemDirectories/" + directory.StringId + "/relationships/parent"; // Act var(httpResponse, responseDocument) = await _testContext.ExecutePatchAsync <Document>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); responseDocument.Data.Should().BeNull(); }
public async Task Can_replace_annotated_ToOne_relationship() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true, Parent = new SystemDirectory { Name = "Data", IsCaseSensitive = true } }; var otherParent = new SystemDirectory { Name = "Data files", IsCaseSensitive = true }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.AddRange(directory, otherParent); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new { type = "systemDirectories", id = otherParent.StringId } }; string route = "/systemDirectories/" + directory.StringId + "/relationships/parent"; // Act (HttpResponseMessage httpResponse, string responseDocument) = await _testContext.ExecutePatchAsync <string>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent); responseDocument.Should().BeEmpty(); }
public async Task Cannot_update_resource_with_invalid_attribute_value() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new { type = "systemDirectories", id = directory.StringId, attributes = new { name = "!@#$%^&*().-" } } }; string route = "/systemDirectories/" + directory.StringId; // Act (HttpResponseMessage httpResponse, ErrorDocument responseDocument) = await _testContext.ExecutePatchAsync <ErrorDocument>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.UnprocessableEntity); responseDocument.Errors.Should().HaveCount(1); Error error = responseDocument.Errors[0]; error.StatusCode.Should().Be(HttpStatusCode.UnprocessableEntity); error.Title.Should().Be("Input validation failed."); error.Detail.Should().Be("The field Name must match the regular expression '^[\\w\\s]+$'."); error.Source.Pointer.Should().Be("/data/attributes/name"); }
public async Task When_patching_resource_with_invalid_attribute_value_it_must_fail() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); await dbContext.SaveChangesAsync(); }); var content = new { data = new { type = "systemDirectories", id = directory.StringId, attributes = new Dictionary <string, object> { ["name"] = "!@#$%^&*().-" } } }; string requestBody = JsonConvert.SerializeObject(content); string route = "/systemDirectories/" + directory.StringId; // Act var(httpResponse, responseDocument) = await _testContext.ExecutePatchAsync <ErrorDocument>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.UnprocessableEntity); responseDocument.Errors.Should().HaveCount(1); responseDocument.Errors[0].StatusCode.Should().Be(HttpStatusCode.UnprocessableEntity); responseDocument.Errors[0].Title.Should().Be("Input validation failed."); responseDocument.Errors[0].Detail.Should().Be("The field Name must match the regular expression '^[\\w\\s]+$'."); responseDocument.Errors[0].Source.Pointer.Should().Be("/data/attributes/name"); }
public async Task Can_add_to_annotated_ToMany_relationship() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true }; var file = new SystemFile { FileName = "Main.cs", SizeInBytes = 100 }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.AddRange(directory, file); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new[] { new { type = "systemFiles", id = file.StringId } } }; string route = $"/systemDirectories/{directory.StringId}/relationships/files"; // Act (HttpResponseMessage httpResponse, string responseDocument) = await _testContext.ExecutePostAsync <string>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent); responseDocument.Should().BeEmpty(); }
public async Task Cannot_update_resource_with_null_for_required_attribute_value() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new { type = "systemDirectories", id = directory.StringId, attributes = new { name = (string)null } } }; string route = "/systemDirectories/" + directory.StringId; // Act var(httpResponse, responseDocument) = await _testContext.ExecutePatchAsync <ErrorDocument>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.UnprocessableEntity); responseDocument.Errors.Should().HaveCount(1); responseDocument.Errors[0].StatusCode.Should().Be(HttpStatusCode.UnprocessableEntity); responseDocument.Errors[0].Title.Should().Be("Input validation failed."); responseDocument.Errors[0].Detail.Should().Be("The Name field is required."); responseDocument.Errors[0].Source.Pointer.Should().Be("/data/attributes/name"); }
public async Task When_patching_resource_with_valid_attribute_value_it_must_succeed() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new { type = "systemDirectories", id = directory.StringId, attributes = new { name = "Repositories" } } }; string route = "/systemDirectories/" + directory.StringId; // Act var(httpResponse, responseDocument) = await _testContext.ExecutePatchAsync <string>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent); responseDocument.Should().BeEmpty(); }
public async Task Can_remove_from_annotated_ToMany_relationship() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true, Files = new List <SystemFile> { new SystemFile { FileName = "Main.cs", SizeInBytes = 100 } } }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.AddRange(directory); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new object[0] }; string route = $"/systemDirectories/{directory.StringId}/relationships/files"; // Act var(httpResponse, responseDocument) = await _testContext.ExecuteDeleteAsync <string>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent); responseDocument.Should().BeEmpty(); }
public async Task Can_update_resource_with_omitted_required_attribute_value() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new { type = "systemDirectories", id = directory.StringId, attributes = new { sizeInBytes = 100 } } }; string route = "/systemDirectories/" + directory.StringId; // Act (HttpResponseMessage httpResponse, string responseDocument) = await _testContext.ExecutePatchAsync <string>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent); responseDocument.Should().BeEmpty(); }
public async Task When_patching_resource_with_annotated_relationships_it_must_succeed() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = false, Subdirectories = new List <SystemDirectory> { new SystemDirectory { Name = "C#", IsCaseSensitive = false } }, Files = new List <SystemFile> { new SystemFile { FileName = "readme.txt" } }, Parent = new SystemDirectory { Name = "Data", IsCaseSensitive = false } }; var otherParent = new SystemDirectory { Name = "Shared", IsCaseSensitive = false }; var otherSubdirectory = new SystemDirectory { Name = "Shared", IsCaseSensitive = false }; var otherFile = new SystemFile { FileName = "readme.md" }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.AddRange(directory, otherParent, otherSubdirectory); dbContext.Files.Add(otherFile); await dbContext.SaveChangesAsync(); }); var content = new { data = new { type = "systemDirectories", id = directory.StringId, attributes = new Dictionary <string, object> { ["name"] = "Project Files" }, relationships = new Dictionary <string, object> { ["subdirectories"] = new { data = new[] { new { type = "systemDirectories", id = otherSubdirectory.StringId } } }, ["files"] = new { data = new[] { new { type = "systemFiles", id = otherFile.StringId } } }, ["parent"] = new { data = new { type = "systemDirectories", id = otherParent.StringId } } } } }; string requestBody = JsonConvert.SerializeObject(content); string route = "/systemDirectories/" + directory.StringId; // Act var(httpResponse, responseDocument) = await _testContext.ExecutePatchAsync <Document>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); responseDocument.Data.Should().BeNull(); }
public async Task When_posting_resource_with_annotated_relationships_it_must_succeed() { // Arrange var parentDirectory = new SystemDirectory { Name = "Shared", IsCaseSensitive = true }; var subdirectory = new SystemDirectory { Name = "Open Source", IsCaseSensitive = true }; var file = new SystemFile { FileName = "Main.cs", SizeInBytes = 100 }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.AddRange(parentDirectory, subdirectory); dbContext.Files.Add(file); await dbContext.SaveChangesAsync(); }); var content = new { data = new { type = "systemDirectories", attributes = new Dictionary <string, object> { ["name"] = "Projects", ["isCaseSensitive"] = "true" }, relationships = new Dictionary <string, object> { ["subdirectories"] = new { data = new[] { new { type = "systemDirectories", id = subdirectory.StringId } } }, ["files"] = new { data = new[] { new { type = "systemFiles", id = file.StringId } } }, ["parent"] = new { data = new { type = "systemDirectories", id = parentDirectory.StringId } } } } }; string requestBody = JsonConvert.SerializeObject(content); string route = "/systemDirectories"; // Act var(httpResponse, responseDocument) = await _testContext.ExecutePostAsync <Document>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.Created); responseDocument.SingleData.Should().NotBeNull(); responseDocument.SingleData.Attributes["name"].Should().Be("Projects"); responseDocument.SingleData.Attributes["isCaseSensitive"].Should().Be(true); }
public async Task Can_update_resource_with_annotated_relationships() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = false, Subdirectories = new List <SystemDirectory> { new SystemDirectory { Name = "C#", IsCaseSensitive = false } }, Files = new List <SystemFile> { new SystemFile { FileName = "readme.txt" } }, Parent = new SystemDirectory { Name = "Data", IsCaseSensitive = false } }; var otherParent = new SystemDirectory { Name = "Shared", IsCaseSensitive = false }; var otherSubdirectory = new SystemDirectory { Name = "Shared", IsCaseSensitive = false }; var otherFile = new SystemFile { FileName = "readme.md" }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.AddRange(directory, otherParent, otherSubdirectory); dbContext.Files.Add(otherFile); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new { type = "systemDirectories", id = directory.StringId, attributes = new { name = "Project Files" }, relationships = new { subdirectories = new { data = new[] { new { type = "systemDirectories", id = otherSubdirectory.StringId } } }, files = new { data = new[] { new { type = "systemFiles", id = otherFile.StringId } } }, parent = new { data = new { type = "systemDirectories", id = otherParent.StringId } } } } }; string route = "/systemDirectories/" + directory.StringId; // Act (HttpResponseMessage httpResponse, string responseDocument) = await _testContext.ExecutePatchAsync <string>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent); responseDocument.Should().BeEmpty(); }
public async Task Cannot_update_resource_with_invalid_ID() { // Arrange var directory = new SystemDirectory { Name = "Projects", IsCaseSensitive = true }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.Add(directory); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new { type = "systemDirectories", id = -1, attributes = new { name = "Repositories" }, relationships = new { subdirectories = new { data = new[] { new { type = "systemDirectories", id = -1 } } } } } }; const string route = "/systemDirectories/-1"; // Act (HttpResponseMessage httpResponse, ErrorDocument responseDocument) = await _testContext.ExecutePatchAsync <ErrorDocument>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.UnprocessableEntity); responseDocument.Errors.Should().HaveCount(2); Error error1 = responseDocument.Errors[0]; error1.StatusCode.Should().Be(HttpStatusCode.UnprocessableEntity); error1.Title.Should().Be("Input validation failed."); error1.Detail.Should().Be("The field Id must match the regular expression '^[0-9]+$'."); error1.Source.Pointer.Should().Be("/data/attributes/id"); Error error2 = responseDocument.Errors[1]; error2.StatusCode.Should().Be(HttpStatusCode.UnprocessableEntity); error2.Title.Should().Be("Input validation failed."); error2.Detail.Should().Be("The field Id must match the regular expression '^[0-9]+$'."); error2.Source.Pointer.Should().Be("/data/attributes/Subdirectories[0].Id"); }
public async Task Can_create_resource_with_annotated_relationships() { // Arrange var parentDirectory = new SystemDirectory { Name = "Shared", IsCaseSensitive = true }; var subdirectory = new SystemDirectory { Name = "Open Source", IsCaseSensitive = true }; var file = new SystemFile { FileName = "Main.cs", SizeInBytes = 100 }; await _testContext.RunOnDatabaseAsync(async dbContext => { dbContext.Directories.AddRange(parentDirectory, subdirectory); dbContext.Files.Add(file); await dbContext.SaveChangesAsync(); }); var requestBody = new { data = new { type = "systemDirectories", attributes = new { name = "Projects", isCaseSensitive = true }, relationships = new { subdirectories = new { data = new[] { new { type = "systemDirectories", id = subdirectory.StringId } } }, files = new { data = new[] { new { type = "systemFiles", id = file.StringId } } }, parent = new { data = new { type = "systemDirectories", id = parentDirectory.StringId } } } } }; const string route = "/systemDirectories"; // Act (HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAsync <Document>(route, requestBody); // Assert httpResponse.Should().HaveStatusCode(HttpStatusCode.Created); responseDocument.SingleData.Should().NotBeNull(); responseDocument.SingleData.Attributes["name"].Should().Be("Projects"); responseDocument.SingleData.Attributes["isCaseSensitive"].Should().Be(true); }