From b35538451fd5f848b81f90df33aac2cd76ee9d9e Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 24 Jul 2022 20:03:35 +0200 Subject: [PATCH] Test improvements. --- .../TestSuite.ApiTests/AnonymousTests.cs | 27 +++++-- .../TestSuite.ApiTests/AppClientsTests.cs | 10 ++- .../AppContributorsTests.cs | 19 ++++- .../TestSuite.ApiTests/AppCreationTests.cs | 56 +++++++++----- .../TestSuite.ApiTests/AppRolesTests.cs | 26 ++++++- .../TestSuite.ApiTests/AssetTests.cs | 27 +++++-- .../TestSuite.ApiTests/BackupTests.cs | 76 +++++++++++++++++-- .../TestSuite.ApiTests/CommentsTests.cs | 20 ++++- .../TestSuite.ApiTests/SchemaTests.cs | 56 ++++++++++++-- .../TestSuite.Shared/Utils/TestHelpers.cs | 2 +- 10 files changed, 262 insertions(+), 57 deletions(-) diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/AnonymousTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/AnonymousTests.cs index 818afd586..2429d3173 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/AnonymousTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/AnonymousTests.cs @@ -30,7 +30,10 @@ namespace TestSuite.ApiTests var appName = Guid.NewGuid().ToString(); // STEP 1: Create app - var createRequest = new CreateAppDto { Name = appName }; + var createRequest = new CreateAppDto + { + Name = appName + }; var app = await _.Apps.PostAppAsync(createRequest); @@ -39,7 +42,10 @@ namespace TestSuite.ApiTests // STEP 2: Make the client anonymous. - var clientRequest = new UpdateClientDto { AllowAnonymous = true }; + var clientRequest = new UpdateClientDto + { + AllowAnonymous = true + }; await _.Apps.PutClientAsync(appName, "default", clientRequest); @@ -61,7 +67,10 @@ namespace TestSuite.ApiTests var appName = Guid.NewGuid().ToString(); // STEP 1: Create app - var createRequest = new CreateAppDto { Name = appName }; + var createRequest = new CreateAppDto + { + Name = appName + }; var app = await _.Apps.PostAppAsync(createRequest); @@ -70,13 +79,21 @@ namespace TestSuite.ApiTests // STEP 2: Make the client anonymous. - var clientRequest = new UpdateClientDto { AllowAnonymous = true }; + var clientRequest = new UpdateClientDto + { + AllowAnonymous = true + }; await _.Apps.PutClientAsync(appName, "default", clientRequest); // STEP 3: Create schema - var schemaRequest = new CreateSchemaDto { Name = "my-content", IsPublished = true }; + var schemaRequest = new CreateSchemaDto + { + Name = "my-content", + // Schema must be published to create content. + IsPublished = true + }; await _.Schemas.PostSchemaAsync(appName, schemaRequest); diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/AppClientsTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/AppClientsTests.cs index 12d49d92f..bd5784636 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/AppClientsTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/AppClientsTests.cs @@ -95,7 +95,10 @@ namespace TestSuite.ApiTests private async Task CreateAsync() { - var createRequest = new CreateClientDto { Id = id }; + var createRequest = new CreateClientDto + { + Id = id + }; var clients = await _.Apps.PostClientAsync(appName, createRequest); var client = clients.Items.Find(x => x.Id == id); @@ -105,7 +108,10 @@ namespace TestSuite.ApiTests private async Task CreateAppAsync() { - var createRequest = new CreateAppDto { Name = appName }; + var createRequest = new CreateAppDto + { + Name = appName + }; await _.Apps.PostAppAsync(createRequest); } diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/AppContributorsTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/AppContributorsTests.cs index 3321f04ce..547cc0c51 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/AppContributorsTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/AppContributorsTests.cs @@ -34,7 +34,10 @@ namespace TestSuite.ApiTests // STEP 1: Do not invite contributors when flag is false. - var createRequest = new AssignContributorDto { ContributorId = "test@squidex.io" }; + var createRequest = new AssignContributorDto + { + ContributorId = "test@squidex.io" + }; var ex = await Assert.ThrowsAnyAsync(() => { @@ -69,7 +72,12 @@ namespace TestSuite.ApiTests // STEP 1: Update contributor role. - var updateRequest = new AssignContributorDto { ContributorId = email, Role = "Owner" }; + var updateRequest = new AssignContributorDto + { + ContributorId = email, + // Test update of role. + Role = "Owner" + }; var contributors_2 = await _.Apps.PostContributorAsync(appName, updateRequest); var contributor_2 = contributors_2.Items.Find(x => x.ContributorId == contributor.ContributorId); @@ -96,7 +104,12 @@ namespace TestSuite.ApiTests private async Task InviteAsync() { - var createInviteRequest = new AssignContributorDto { ContributorId = email, Invite = true }; + var createInviteRequest = new AssignContributorDto + { + ContributorId = email, + // Invite must be true, otherwise new users are not created. + Invite = true + }; var contributors = await _.Apps.PostContributorAsync(appName, createInviteRequest); var contributor = contributors.Items.Find(x => x.ContributorName == email); diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/AppCreationTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/AppCreationTests.cs index e40580dfa..974c28d09 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/AppCreationTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/AppCreationTests.cs @@ -16,6 +16,8 @@ namespace TestSuite.ApiTests { public class AppCreationTests : IClassFixture { + private readonly string appName = Guid.NewGuid().ToString(); + public ClientFixture _ { get; } public AppCreationTests(ClientFixture fixture) @@ -26,10 +28,11 @@ namespace TestSuite.ApiTests [Fact] public async Task Should_create_app() { - var appName = Guid.NewGuid().ToString(); - // STEP 1: Create app - var createRequest = new CreateAppDto { Name = appName }; + var createRequest = new CreateAppDto + { + Name = appName + }; var app = await _.Apps.PostAppAsync(createRequest); @@ -61,15 +64,16 @@ namespace TestSuite.ApiTests [Fact] public async Task Should_not_allow_creation_if_name_used() { - var appName = Guid.NewGuid().ToString(); - // STEP 1: Create app - var createRequest = new CreateAppDto { Name = appName }; - - await _.Apps.PostAppAsync(createRequest); + await CreateAppAsync(); // STEP 2: Create again and fail + var createRequest = new CreateAppDto + { + Name = appName + }; + var ex = await Assert.ThrowsAnyAsync(() => { return _.Apps.PostAppAsync(createRequest); @@ -81,12 +85,8 @@ namespace TestSuite.ApiTests [Fact] public async Task Should_archive_app() { - var appName = Guid.NewGuid().ToString(); - // STEP 1: Create app - var createRequest = new CreateAppDto { Name = appName }; - - await _.Apps.PostAppAsync(createRequest); + await CreateAppAsync(); // STEP 2: Archive app @@ -101,12 +101,8 @@ namespace TestSuite.ApiTests [Fact] public async Task Should_recreate_after_archived() { - var appName = Guid.NewGuid().ToString(); - // STEP 1: Create app - var createRequest = new CreateAppDto { Name = appName }; - - await _.Apps.PostAppAsync(createRequest); + await CreateAppAsync(); // STEP 2: Archive app @@ -114,14 +110,17 @@ namespace TestSuite.ApiTests // STEP 3: Create app again + var createRequest = new CreateAppDto + { + Name = appName + }; + await _.Apps.PostAppAsync(createRequest); } [Fact] public async Task Should_create_app_from_templates() { - var appName = Guid.NewGuid().ToString(); - // STEP 1: Get template. var templates = await _.Templates.GetTemplatesAsync(); @@ -129,7 +128,12 @@ namespace TestSuite.ApiTests // STEP 2: Create app. - var createRequest = new CreateAppDto { Name = appName, Template = template.Name }; + var createRequest = new CreateAppDto + { + Name = appName, + // The template is just referenced by the name. + Template = template.Name + }; await _.Apps.PostAppAsync(createRequest); @@ -139,5 +143,15 @@ namespace TestSuite.ApiTests Assert.NotEmpty(schemas.Items); } + + private async Task CreateAppAsync() + { + var createRequest = new CreateAppDto + { + Name = appName + }; + + await _.Apps.PostAppAsync(createRequest); + } } } diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/AppRolesTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/AppRolesTests.cs index 209b1c6fb..8cdfb6598 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/AppRolesTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/AppRolesTests.cs @@ -75,7 +75,12 @@ namespace TestSuite.ApiTests // STEP 2 Assign client and contributor. - await _.Apps.PostClientAsync(_.AppName, new CreateClientDto { Id = client }); + var createClientRequest = new CreateClientDto + { + Id = client + }; + + await _.Apps.PostClientAsync(_.AppName, createClientRequest); await AssignClient(roleName); @@ -141,21 +146,34 @@ namespace TestSuite.ApiTests private async Task AssignContributor(string role = null) { - var assignRequest = new AssignContributorDto { ContributorId = contributor, Role = role, Invite = true }; + var assignRequest = new AssignContributorDto + { + ContributorId = contributor, + // Test diffferent role names. + Role = role, + // Invite must be true, otherwise new users are not created. + Invite = true + }; await _.Apps.PostContributorAsync(_.AppName, assignRequest); } private async Task AssignClient(string role = null) { - var updateRequest = new UpdateClientDto { Role = role }; + var updateRequest = new UpdateClientDto + { + Role = role + }; await _.Apps.PutClientAsync(_.AppName, client, updateRequest); } private async Task CreateRoleAsync(string name) { - var createRequest = new AddRoleDto { Name = name }; + var createRequest = new AddRoleDto + { + Name = name + }; var roles = await _.Apps.PostRoleAsync(_.AppName, createRequest); var role = roles.Items.Find(x => x.Name == name); diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/AssetTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/AssetTests.cs index 0778e6140..9a94f2f0f 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/AssetTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/AssetTests.cs @@ -296,7 +296,10 @@ namespace TestSuite.ApiTests // STEP 3: Annotate slug. - var slugRequest = new AnnotateAssetDto { Slug = "my-image" }; + var slugRequest = new AnnotateAssetDto + { + Slug = "my-image" + }; var asset_3 = await _.Assets.PutAssetAsync(_.AppName, asset_2.Id, slugRequest); @@ -305,7 +308,10 @@ namespace TestSuite.ApiTests // STEP 3: Annotate file name. - var fileNameRequest = new AnnotateAssetDto { FileName = "My Image" }; + var fileNameRequest = new AnnotateAssetDto + { + FileName = "My Image" + }; var asset_4 = await _.Assets.PutAssetAsync(_.AppName, asset_3.Id, fileNameRequest); @@ -333,7 +339,10 @@ namespace TestSuite.ApiTests // STEP 4: Protect asset - var protectRequest = new AnnotateAssetDto { IsProtected = true }; + var protectRequest = new AnnotateAssetDto + { + IsProtected = true + }; var asset_2 = await _.Assets.PutAssetAsync(_.AppName, asset_1.Id, protectRequest); @@ -458,13 +467,21 @@ namespace TestSuite.ApiTests public async Task Should_delete_recursively() { // STEP 1: Create asset folder - var createRequest1 = new CreateAssetFolderDto { FolderName = "folder1" }; + var createRequest1 = new CreateAssetFolderDto + { + FolderName = "folder1" + }; var folder_1 = await _.Assets.PostAssetFolderAsync(_.AppName, createRequest1); // STEP 2: Create nested asset folder - var createRequest2 = new CreateAssetFolderDto { FolderName = "subfolder", ParentId = folder_1.Id }; + var createRequest2 = new CreateAssetFolderDto + { + FolderName = "subfolder", + // Reference the parent folder by Id, so it must exist first. + ParentId = folder_1.Id + }; var folder_2 = await _.Assets.PostAssetFolderAsync(_.AppName, createRequest2); diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/BackupTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/BackupTests.cs index ae4b663d8..4aa578fb2 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/BackupTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/BackupTests.cs @@ -37,7 +37,10 @@ namespace TestSuite.ApiTests var appNameRestore = $"{appName}-restore"; // STEP 1: Create app - var createRequest = new CreateAppDto { Name = appName }; + var createRequest = new CreateAppDto + { + Name = appName + }; await _.Apps.PostAppAsync(createRequest); @@ -57,7 +60,12 @@ namespace TestSuite.ApiTests // STEP 4: Restore backup var uri = new Uri(new Uri(backupUrl), backup._links["download"].Href); - var restoreRequest = new RestoreRequestDto { Url = uri, Name = appNameRestore }; + var restoreRequest = new RestoreRequestDto + { + Url = uri, + // Choose a new app name, because the old one is deleted. + Name = appNameRestore + }; await _.Backups.PostRestoreJobAsync(restoreRequest); @@ -68,6 +76,56 @@ namespace TestSuite.ApiTests Assert.Equal(JobStatus.Completed, restore?.Status); } + [Fact] + public async Task Should_backup_and_restore_app_with_deleted_app() + { + // Load the backup from another URL, because the public URL is might not be accessible for the server. + var backupUrl = TestHelpers.GetAndPrintValue("config:backupUrl", _.ServerUrl); + + // STEP 1: Create app + var createRequest = new CreateAppDto + { + Name = appName + }; + + await _.Apps.PostAppAsync(createRequest); + + + // STEP 2: Prepare app. + await PrepareAppAsync(appName); + + + // STEP 3: Create backup + await _.Backups.PostBackupAsync(appName); + + var backup = await _.Backups.WaitForBackupAsync(appName, TimeSpan.FromMinutes(2)); + + Assert.Equal(JobStatus.Completed, backup?.Status); + + + // STEP 4: Delete app + await _.Apps.DeleteAppAsync(appName); + + + // STEP 5: Restore backup + var uri = new Uri(new Uri(backupUrl), backup._links["download"].Href); + + var restoreRequest = new RestoreRequestDto + { + Url = uri, + // Restore the old app name, because it has been deleted anyway. + Name = appName + }; + + await _.Backups.PostRestoreJobAsync(restoreRequest); + + + // STEP 6: Wait for the backup. + var restore = await _.Backups.WaitForRestoreAsync(uri, TimeSpan.FromMinutes(2)); + + Assert.Equal(JobStatus.Completed, restore?.Status); + } + private async Task PrepareAppAsync(string appName) { // Create a test schema. @@ -90,15 +148,21 @@ namespace TestSuite.ApiTests // Create a workflow - var workflow = new AddWorkflowDto { Name = appName }; + var workflowRequest = new AddWorkflowDto + { + Name = appName + }; - await _.Apps.PostWorkflowAsync(appName, workflow); + await _.Apps.PostWorkflowAsync(appName, workflowRequest); // Create a language - var language = new AddLanguageDto { Language = "de" }; + var languageRequest = new AddLanguageDto + { + Language = "de" + }; - await _.Apps.PostLanguageAsync(appName, language); + await _.Apps.PostLanguageAsync(appName, languageRequest); } } } diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/CommentsTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/CommentsTests.cs index d0a30c421..12bb4621b 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/CommentsTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/CommentsTests.cs @@ -37,7 +37,10 @@ namespace TestSuite.ApiTests public async Task Should_create_comment() { // STEP 1: Create the comment. - var createRequest = new UpsertCommentDto { Text = resource }; + var createRequest = new UpsertCommentDto + { + Text = resource + }; await _.Comments.PostCommentAsync(_.AppName, resource, createRequest); @@ -52,13 +55,19 @@ namespace TestSuite.ApiTests public async Task Should_update_comment() { // STEP 1: Create the comment. - var createRequest = new UpsertCommentDto { Text = resource }; + var createRequest = new UpsertCommentDto + { + Text = resource + }; var comment = await _.Comments.PostCommentAsync(_.AppName, resource, createRequest); // STEP 2: Update comment. - var updateRequest = new UpsertCommentDto { Text = $"{resource}_Update" }; + var updateRequest = new UpsertCommentDto + { + Text = $"{resource}_Update" + }; await _.Comments.PutCommentAsync(_.AppName, resource, comment.Id, updateRequest); @@ -73,7 +82,10 @@ namespace TestSuite.ApiTests public async Task Should_delete_comment() { // STEP 1: Create the comment. - var createRequest = new UpsertCommentDto { Text = resource }; + var createRequest = new UpsertCommentDto + { + Text = resource + }; var comment = await _.Comments.PostCommentAsync(_.AppName, resource, createRequest); diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/SchemaTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/SchemaTests.cs index 944cd2007..9c2f661e3 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/SchemaTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/SchemaTests.cs @@ -30,7 +30,10 @@ namespace TestSuite.ApiTests public async Task Should_create_schema() { // STEP 1: Create schema - var createRequest = new CreateSchemaDto { Name = schemaName }; + var createRequest = new CreateSchemaDto + { + Name = schemaName + }; var schema = await _.Schemas.PostSchemaAsync(_.AppName, createRequest); @@ -49,7 +52,10 @@ namespace TestSuite.ApiTests public async Task Should_not_allow_creation_if_name_used() { // STEP 1: Create schema - var createRequest = new CreateSchemaDto { Name = schemaName }; + var createRequest = new CreateSchemaDto + { + Name = schemaName + }; var schema = await _.Schemas.PostSchemaAsync(_.AppName, createRequest); @@ -70,8 +76,40 @@ namespace TestSuite.ApiTests var createRequest = new CreateSchemaDto { Name = schemaName, - IsSingleton = true, - IsPublished = true + // Use the new property to create a singleton. + Type = SchemaType.Singleton + }; + + var schema = await _.Schemas.PostSchemaAsync(_.AppName, createRequest); + + // Should return created schemas with correct name. + Assert.Equal(schemaName, schema.Name); + + + // STEP 2: Get all schemas + var schemas = await _.Schemas.GetSchemasAsync(_.AppName); + + // Should provide new schema when apps are schemas. + Assert.Contains(schemas.Items, x => x.Name == schemaName); + + + // STEP 3: Get singleton content + var client = _.ClientManager.CreateDynamicContentsClient(schemaName); + + var content = await client.GetAsync(schema.Id); + + Assert.NotNull(content); + } + + [Fact] + public async Task Should_create_singleton_schema_with_obsolete_property() + { + // STEP 1: Create schema + var createRequest = new CreateSchemaDto + { + Name = schemaName, + // Use the old property to create a singleton. + IsSingleton = true }; var schema = await _.Schemas.PostSchemaAsync(_.AppName, createRequest); @@ -136,7 +174,10 @@ namespace TestSuite.ApiTests public async Task Should_delete_Schema() { // STEP 1: Create schema - var createRequest = new CreateSchemaDto { Name = schemaName }; + var createRequest = new CreateSchemaDto + { + Name = schemaName + }; var schema = await _.Schemas.PostSchemaAsync(_.AppName, createRequest); @@ -157,7 +198,10 @@ namespace TestSuite.ApiTests public async Task Should_recreate_after_deleted() { // STEP 1: Create schema - var createRequest = new CreateSchemaDto { Name = schemaName }; + var createRequest = new CreateSchemaDto + { + Name = schemaName + }; var schema = await _.Schemas.PostSchemaAsync(_.AppName, createRequest); diff --git a/backend/tools/TestSuite/TestSuite.Shared/Utils/TestHelpers.cs b/backend/tools/TestSuite/TestSuite.Shared/Utils/TestHelpers.cs index bb631fa3a..c41638073 100644 --- a/backend/tools/TestSuite/TestSuite.Shared/Utils/TestHelpers.cs +++ b/backend/tools/TestSuite/TestSuite.Shared/Utils/TestHelpers.cs @@ -35,7 +35,7 @@ namespace TestSuite.Utils } else { - Console.WriteLine("Using: {0}={1}", name, value); + Console.WriteLine("Using <{0}>=<{1}>", name, value); } return value;