mirror of https://github.com/Squidex/squidex.git
Browse Source
* Add a test for content version endpoint. * Refactor tests into smaller chunks. * Fix tests. * Own app for clients tests.pull/811/head
committed by
GitHub
16 changed files with 793 additions and 255 deletions
@ -0,0 +1,119 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using Squidex.ClientLibrary.Management; |
|||
using TestSuite.Fixtures; |
|||
using Xunit; |
|||
|
|||
#pragma warning disable SA1300 // Element should begin with upper-case letter
|
|||
#pragma warning disable SA1507 // Code should not contain multiple blank lines in a row
|
|||
|
|||
namespace TestSuite.ApiTests |
|||
{ |
|||
public sealed class AppClientsTests : IClassFixture<ClientFixture> |
|||
{ |
|||
private readonly string appName = Guid.NewGuid().ToString(); |
|||
private readonly string id = Guid.NewGuid().ToString(); |
|||
private readonly string clientRole = "Editor"; |
|||
private readonly string clientName = "My Client"; |
|||
|
|||
public ClientFixture _ { get; } |
|||
|
|||
public AppClientsTests(ClientFixture fixture) |
|||
{ |
|||
_ = fixture; |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_create_client() |
|||
{ |
|||
// STEP 0: Create app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 1: Create client.
|
|||
var client = await CreateAsync(); |
|||
|
|||
// Should return client with correct name and id.
|
|||
Assert.Equal(clientRole, client.Role); |
|||
Assert.Equal(id, client.Name); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_update_client() |
|||
{ |
|||
// STEP 0: Create app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 0: Create client.
|
|||
var client = await CreateAsync(); |
|||
|
|||
|
|||
// STEP 1: Update client name.
|
|||
var updateNameRequest = new UpdateClientDto |
|||
{ |
|||
Name = clientName, |
|||
AllowAnonymous = true, |
|||
ApiCallsLimit = 100, |
|||
ApiTrafficLimit = 200, |
|||
Role = "Owner" |
|||
}; |
|||
|
|||
var clients_2 = await _.Apps.PutClientAsync(appName, client.Id, updateNameRequest); |
|||
var client_2 = clients_2.Items.Find(x => x.Id == client.Id); |
|||
|
|||
// Should update client name.
|
|||
Assert.Equal(updateNameRequest.Name, client_2.Name); |
|||
Assert.Equal(updateNameRequest.AllowAnonymous, client_2.AllowAnonymous); |
|||
Assert.Equal(updateNameRequest.ApiCallsLimit, client_2.ApiCallsLimit); |
|||
Assert.Equal(updateNameRequest.ApiTrafficLimit, client_2.ApiTrafficLimit); |
|||
Assert.Equal(updateNameRequest.Role, client_2.Role); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_delete_client() |
|||
{ |
|||
// STEP 0: Create app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 0: Create client.
|
|||
var client = await CreateAsync(); |
|||
|
|||
|
|||
// STEP 1: Delete client
|
|||
var clients_2 = await _.Apps.DeleteClientAsync(appName, client.Id); |
|||
|
|||
// Should not return deleted client.
|
|||
Assert.DoesNotContain(clients_2.Items, x => x.Id == client.Id); |
|||
} |
|||
|
|||
private async Task<ClientDto> CreateAsync() |
|||
{ |
|||
var createRequest = new CreateClientDto |
|||
{ |
|||
Id = id |
|||
}; |
|||
|
|||
var clients = await _.Apps.PostClientAsync(appName, createRequest); |
|||
var client = clients.Items.Find(x => x.Id == id); |
|||
|
|||
return client; |
|||
} |
|||
|
|||
private async Task CreateAppAsync() |
|||
{ |
|||
var createRequest = new CreateAppDto |
|||
{ |
|||
Name = appName |
|||
}; |
|||
|
|||
await _.Apps.PostAppAsync(createRequest); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,97 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using Squidex.ClientLibrary.Management; |
|||
using TestSuite.Fixtures; |
|||
using Xunit; |
|||
|
|||
#pragma warning disable SA1300 // Element should begin with upper-case letter
|
|||
#pragma warning disable SA1507 // Code should not contain multiple blank lines in a row
|
|||
|
|||
namespace TestSuite.ApiTests |
|||
{ |
|||
public sealed class AppContributorsTests : IClassFixture<CreatedAppFixture> |
|||
{ |
|||
private readonly string email = $"{Guid.NewGuid()}@squidex.io"; |
|||
|
|||
public CreatedAppFixture _ { get; } |
|||
|
|||
public AppContributorsTests(CreatedAppFixture fixture) |
|||
{ |
|||
_ = fixture; |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_not_invite_contributor_if_flag_is_false() |
|||
{ |
|||
// STEP 0: Do not invite contributors when flag is false.
|
|||
var createRequest = new AssignContributorDto { ContributorId = "test@squidex.io" }; |
|||
|
|||
var ex = await Assert.ThrowsAsync<SquidexManagementException>(() => |
|||
{ |
|||
return _.Apps.PostContributorAsync(_.AppName, createRequest); |
|||
}); |
|||
|
|||
Assert.Equal(404, ex.StatusCode); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_invite_contributor() |
|||
{ |
|||
// STEP 1: Assign contributor.
|
|||
ContributorDto contributor_1 = await InviteAsync(); |
|||
|
|||
Assert.Equal("Developer", contributor_1?.Role); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_update_contributor() |
|||
{ |
|||
// STEP 0: Assign contributor.
|
|||
var contributor = await InviteAsync(); |
|||
|
|||
|
|||
// STEP 1: Update contributor role.
|
|||
var updateRequest = new AssignContributorDto |
|||
{ |
|||
ContributorId = email, Role = "Owner" |
|||
}; |
|||
|
|||
var contributors_2 = await _.Apps.PostContributorAsync(_.AppName, updateRequest); |
|||
var contributor_2 = contributors_2.Items.Find(x => x.ContributorId == contributor.ContributorId); |
|||
|
|||
Assert.Equal(updateRequest.Role, contributor_2?.Role); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_remove_contributor() |
|||
{ |
|||
// STEP 0: Assign contributor.
|
|||
var contributor = await InviteAsync(); |
|||
|
|||
|
|||
// STEP 1: Remove contributor.
|
|||
var contributors_2 = await _.Apps.DeleteContributorAsync(_.AppName, contributor.ContributorId); |
|||
|
|||
Assert.DoesNotContain(contributors_2.Items, x => x.ContributorId == contributor.ContributorId); |
|||
} |
|||
|
|||
private async Task<ContributorDto> InviteAsync() |
|||
{ |
|||
var createInviteRequest = new AssignContributorDto |
|||
{ |
|||
ContributorId = email, |
|||
Invite = true |
|||
}; |
|||
|
|||
var contributors = await _.Apps.PostContributorAsync(_.AppName, createInviteRequest); |
|||
var contributor = contributors.Items.Find(x => x.ContributorName == email); |
|||
|
|||
return contributor; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,175 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using Squidex.ClientLibrary.Management; |
|||
using TestSuite.Fixtures; |
|||
using Xunit; |
|||
|
|||
#pragma warning disable SA1300 // Element should begin with upper-case letter
|
|||
#pragma warning disable SA1507 // Code should not contain multiple blank lines in a row
|
|||
|
|||
namespace TestSuite.ApiTests |
|||
{ |
|||
public sealed class AppLanguagesTests : IClassFixture<ClientFixture> |
|||
{ |
|||
private readonly string appName = Guid.NewGuid().ToString(); |
|||
|
|||
public ClientFixture _ { get; } |
|||
|
|||
public AppLanguagesTests(ClientFixture fixture) |
|||
{ |
|||
_ = fixture; |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_add_language() |
|||
{ |
|||
// STEP 0: Add app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 1: Add languages.
|
|||
await AddLanguageAsync("de"); |
|||
await AddLanguageAsync("it"); |
|||
|
|||
var languages_1 = await _.Apps.GetLanguagesAsync(appName); |
|||
|
|||
Assert.Equal(new string[] { "en", "de", "it" }, languages_1.Items.Select(x => x.Iso2Code).ToArray()); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_update_language() |
|||
{ |
|||
// STEP 0: Add app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 1: Add languages.
|
|||
await AddLanguageAsync("de"); |
|||
await AddLanguageAsync("it"); |
|||
|
|||
|
|||
// STEP 3: Update German language.
|
|||
var updateRequest = new UpdateLanguageDto |
|||
{ |
|||
Fallback = new List<string> |
|||
{ |
|||
"it" |
|||
}, |
|||
IsOptional = true |
|||
}; |
|||
|
|||
var languages_2 = await _.Apps.PutLanguageAsync(appName, "de", updateRequest); |
|||
var language_2_DE = languages_2.Items.Find(x => x.Iso2Code == "de"); |
|||
|
|||
Assert.Equal(updateRequest.Fallback, language_2_DE.Fallback); |
|||
Assert.Equal(updateRequest.IsOptional, language_2_DE.IsOptional); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_update_master_language() |
|||
{ |
|||
// STEP 0: Add app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 1: Add languages.
|
|||
await AddLanguageAsync("de"); |
|||
await AddLanguageAsync("it"); |
|||
|
|||
|
|||
// STEP 2: Update Italian language.
|
|||
var updateRequest = new UpdateLanguageDto |
|||
{ |
|||
Fallback = new List<string> |
|||
{ |
|||
"de" |
|||
}, |
|||
IsOptional = true |
|||
}; |
|||
|
|||
await _.Apps.PutLanguageAsync(appName, "it", updateRequest); |
|||
|
|||
|
|||
// STEP 3: Change master language to Italian.
|
|||
var masterRequest = new UpdateLanguageDto |
|||
{ |
|||
IsMaster = true |
|||
}; |
|||
|
|||
var languages_4 = await _.Apps.PutLanguageAsync(appName, "it", masterRequest); |
|||
var language_4_IT = languages_4.Items.Find(x => x.Iso2Code == "it"); |
|||
var language_4_EN = languages_4.Items.Find(x => x.Iso2Code == "en"); |
|||
|
|||
Assert.True(language_4_IT.IsMaster); |
|||
|
|||
// Old master language is unset.
|
|||
Assert.False(language_4_EN.IsMaster); |
|||
|
|||
// Master language cannot be optional.
|
|||
Assert.False(language_4_IT.IsOptional); |
|||
|
|||
// Fallback for new master language must be removed.
|
|||
Assert.Empty(language_4_IT.Fallback); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_delete_language() |
|||
{ |
|||
// STEP 0: Add app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 1: Add languages.
|
|||
await AddLanguageAsync("de"); |
|||
await AddLanguageAsync("it"); |
|||
|
|||
|
|||
// STEP 2: Update Italian language.
|
|||
var updateRequest = new UpdateLanguageDto |
|||
{ |
|||
Fallback = new List<string> |
|||
{ |
|||
"de" |
|||
}, |
|||
IsOptional = true |
|||
}; |
|||
|
|||
await _.Apps.PutLanguageAsync(appName, "it", updateRequest); |
|||
|
|||
|
|||
// STEP 3: Remove language.
|
|||
var languages_2 = await _.Apps.DeleteLanguageAsync(appName, "de"); |
|||
var language_2_IT = languages_2.Items.Find(x => x.Iso2Code == "it"); |
|||
|
|||
// Fallback language must be removed.
|
|||
Assert.Empty(language_2_IT.Fallback); |
|||
|
|||
Assert.Equal(new string[] { "en", "it" }, languages_2.Items.Select(x => x.Iso2Code).ToArray()); |
|||
} |
|||
|
|||
private async Task CreateAppAsync() |
|||
{ |
|||
var createRequest = new CreateAppDto |
|||
{ |
|||
Name = appName |
|||
}; |
|||
|
|||
await _.Apps.PostAppAsync(createRequest); |
|||
} |
|||
|
|||
private async Task AddLanguageAsync(string code) |
|||
{ |
|||
var createRequest = new AddLanguageDto |
|||
{ |
|||
Language = code |
|||
}; |
|||
|
|||
await _.Apps.PostLanguageAsync(appName, createRequest); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,175 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using Squidex.ClientLibrary.Management; |
|||
using TestSuite.Fixtures; |
|||
using Xunit; |
|||
|
|||
#pragma warning disable SA1300 // Element should begin with upper-case letter
|
|||
#pragma warning disable SA1507 // Code should not contain multiple blank lines in a row
|
|||
|
|||
namespace TestSuite.ApiTests |
|||
{ |
|||
public sealed class AppRolesTests : IClassFixture<CreatedAppFixture> |
|||
{ |
|||
private readonly string roleName = Guid.NewGuid().ToString(); |
|||
private readonly string client = Guid.NewGuid().ToString(); |
|||
private readonly string contributor = $"{Guid.NewGuid()}@squidex.io"; |
|||
|
|||
public CreatedAppFixture _ { get; } |
|||
|
|||
public AppRolesTests(CreatedAppFixture fixture) |
|||
{ |
|||
_ = fixture; |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_create_role() |
|||
{ |
|||
// STEP 1: Add role.
|
|||
var role = await CreateRoleAsync(roleName); |
|||
|
|||
// Should return role with correct name.
|
|||
Assert.Empty(role.Permissions); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_create_role_with_buggy_name() |
|||
{ |
|||
// STEP 1: Add role.
|
|||
var role = await CreateRoleAsync($"{Guid.NewGuid()}/1"); |
|||
|
|||
// Should return role with correct name.
|
|||
Assert.Empty(role.Permissions); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_update_role() |
|||
{ |
|||
// STEP 1: Add role.
|
|||
var role = await CreateRoleAsync(roleName); |
|||
|
|||
|
|||
// STEP 2: Update role.
|
|||
var updateRequest = new UpdateRoleDto |
|||
{ |
|||
Permissions = new List<string> { "a", "b" } |
|||
}; |
|||
|
|||
var roles_2 = await _.Apps.PutRoleAsync(_.AppName, roleName, updateRequest); |
|||
var role_2 = roles_2.Items.Find(x => x.Name == roleName); |
|||
|
|||
// Should return role with correct name.
|
|||
Assert.Equal(updateRequest.Permissions, role_2.Permissions); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_prevent_deletion_if_client_assigned() |
|||
{ |
|||
// STEP 1: Add role.
|
|||
var role = await CreateRoleAsync(roleName); |
|||
|
|||
|
|||
// STEP 2 Assign client and contributor.
|
|||
await _.Apps.PostClientAsync(_.AppName, new CreateClientDto { Id = client }); |
|||
|
|||
await AssignClient(roleName); |
|||
|
|||
var roles_2 = await _.Apps.GetRolesAsync(_.AppName); |
|||
var role_2 = roles_2.Items.Find(x => x.Name == roleName); |
|||
|
|||
// Should return role with correct number of users and clients.
|
|||
Assert.Equal(1, role_2.NumClients); |
|||
Assert.Equal(0, role_2.NumContributors); |
|||
|
|||
|
|||
// STEP 4: Try to delete role.
|
|||
var ex = await Assert.ThrowsAsync<SquidexManagementException<ErrorDto>>(() => |
|||
{ |
|||
return _.Apps.DeleteRoleAsync(_.AppName, roleName); |
|||
}); |
|||
|
|||
Assert.Equal(400, ex.StatusCode); |
|||
|
|||
|
|||
// STEP 5: AssignClient client.
|
|||
await AssignClient("Developer"); |
|||
|
|||
var roles_3 = await _.Apps.DeleteRoleAsync(_.AppName, roleName); |
|||
|
|||
Assert.DoesNotContain(roles_3.Items, x => x.Name == roleName); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_prevent_deletion_if_contributor_assigned() |
|||
{ |
|||
// STEP 1: Add role.
|
|||
var role = await CreateRoleAsync(roleName); |
|||
|
|||
|
|||
// STEP 2 Assign contributor.
|
|||
await AssignContributor(roleName); |
|||
|
|||
var roles_2 = await _.Apps.GetRolesAsync(_.AppName); |
|||
var role_2 = roles_2.Items.Find(x => x.Name == roleName); |
|||
|
|||
// Should return role with correct number of users and clients.
|
|||
Assert.Equal(0, role_2.NumClients); |
|||
Assert.Equal(1, role_2.NumContributors); |
|||
|
|||
|
|||
// STEP 4: Try to delete role.
|
|||
var ex = await Assert.ThrowsAsync<SquidexManagementException<ErrorDto>>(() => |
|||
{ |
|||
return _.Apps.DeleteRoleAsync(_.AppName, roleName); |
|||
}); |
|||
|
|||
Assert.Equal(400, ex.StatusCode); |
|||
|
|||
|
|||
// STEP 5: Remove role after contributor removed.
|
|||
await AssignContributor("Developer"); |
|||
|
|||
var roles_3 = await _.Apps.DeleteRoleAsync(_.AppName, roleName); |
|||
|
|||
Assert.DoesNotContain(roles_3.Items, x => x.Name == roleName); |
|||
} |
|||
|
|||
private async Task AssignContributor(string role = null) |
|||
{ |
|||
var assignRequest = new AssignContributorDto |
|||
{ |
|||
ContributorId = contributor, Role = role, Invite = true |
|||
}; |
|||
|
|||
await _.Apps.PostContributorAsync(_.AppName, assignRequest); |
|||
} |
|||
|
|||
private async Task AssignClient(string role = null) |
|||
{ |
|||
var updateRequest = new UpdateClientDto |
|||
{ |
|||
Role = role |
|||
}; |
|||
|
|||
await _.Apps.PutClientAsync(_.AppName, client, updateRequest); |
|||
} |
|||
|
|||
private async Task<RoleDto> CreateRoleAsync(string name) |
|||
{ |
|||
var createRequest = new AddRoleDto |
|||
{ |
|||
Name = name |
|||
}; |
|||
|
|||
var roles = await _.Apps.PostRoleAsync(_.AppName, createRequest); |
|||
var role = roles.Items.Find(x => x.Name == name); |
|||
|
|||
return role; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,121 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using Squidex.ClientLibrary.Management; |
|||
using TestSuite.Fixtures; |
|||
using Xunit; |
|||
|
|||
#pragma warning disable SA1300 // Element should begin with upper-case letter
|
|||
#pragma warning disable SA1507 // Code should not contain multiple blank lines in a row
|
|||
|
|||
namespace TestSuite.ApiTests |
|||
{ |
|||
public sealed class AppWorkflowsTests : IClassFixture<ClientFixture> |
|||
{ |
|||
private readonly string appName = Guid.NewGuid().ToString(); |
|||
private readonly string name = Guid.NewGuid().ToString(); |
|||
|
|||
public ClientFixture _ { get; } |
|||
|
|||
public AppWorkflowsTests(ClientFixture fixture) |
|||
{ |
|||
_ = fixture; |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_create_workflow() |
|||
{ |
|||
// STEP 0: Create app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 1: Create workflow.
|
|||
var workflow = await CreateAsync(); |
|||
|
|||
Assert.NotNull(workflow); |
|||
Assert.NotNull(workflow.Name); |
|||
Assert.Equal(3, workflow.Steps.Count); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_update_workflow() |
|||
{ |
|||
// STEP 0: Create app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 0: Create workflow.
|
|||
var workflow = await CreateAsync(); |
|||
|
|||
|
|||
// STEP 1: Update workflow.
|
|||
var updateRequest = new UpdateWorkflowDto |
|||
{ |
|||
Initial = "Draft", |
|||
Steps = new Dictionary<string, WorkflowStepDto> |
|||
{ |
|||
["Draft"] = new WorkflowStepDto |
|||
{ |
|||
Transitions = new Dictionary<string, WorkflowTransitionDto> |
|||
{ |
|||
["Published"] = new WorkflowTransitionDto() |
|||
} |
|||
}, |
|||
["Published"] = new WorkflowStepDto(), |
|||
}, |
|||
Name = name |
|||
}; |
|||
|
|||
var workflows_2 = await _.Apps.PutWorkflowAsync(appName, workflow.Id, updateRequest); |
|||
var workflow_2 = workflows_2.Items.Find(x => x.Name == name); |
|||
|
|||
Assert.NotNull(workflow_2); |
|||
Assert.NotNull(workflow_2.Name); |
|||
Assert.Equal(2, workflow_2.Steps.Count); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_delete_workflow() |
|||
{ |
|||
// STEP 0: Create app.
|
|||
await CreateAppAsync(); |
|||
|
|||
|
|||
// STEP 0: Create workflow.
|
|||
var workflow = await CreateAsync(); |
|||
|
|||
|
|||
// STEP 1: Delete workflow.
|
|||
var workflows_2 = await _.Apps.DeleteWorkflowAsync(appName, workflow.Id); |
|||
|
|||
Assert.DoesNotContain(workflows_2.Items, x => x.Name == name); |
|||
} |
|||
|
|||
private async Task<WorkflowDto> CreateAsync() |
|||
{ |
|||
var createRequest = new AddWorkflowDto |
|||
{ |
|||
Name = name |
|||
}; |
|||
|
|||
var workflows = await _.Apps.PostWorkflowAsync(appName, createRequest); |
|||
var workflow = workflows.Items.Find(x => x.Name == name); |
|||
|
|||
return workflow; |
|||
} |
|||
|
|||
private async Task CreateAppAsync() |
|||
{ |
|||
var createRequest = new CreateAppDto |
|||
{ |
|||
Name = appName |
|||
}; |
|||
|
|||
await _.Apps.PostAppAsync(createRequest); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue