Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<CentralPackageTransitivePinningEnabled>false</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="coverlet.collector" Version="10.0.1" />
<PackageVersion Include="coverlet.collector" Version="10.1.0" />
<PackageVersion Include="Docker.DotNet.Enhanced" Version="4.3.3" />
<PackageVersion Include="DotNet.ReproducibleBuilds" Version="2.0.5" />
<PackageVersion Include="LibGit2Sharp" Version="0.30.0" />
Expand All @@ -17,7 +17,7 @@
<PackageVersion Include="NeoSmart.AsyncLock" Version="3.2.1" />
<PackageVersion Include="NSubstitute" Version="6.2.0" />
<PackageVersion Include="NuGet.Versioning" Version="7.9.0" />
<PackageVersion Include="NUnit" Version="4.6.1" />
<PackageVersion Include="NUnit" Version="5.0.0" />
<PackageVersion Include="NUnit.Analyzers" Version="4.15.0" />
<PackageVersion Include="NUnit3TestAdapter" Version="6.3.0" />
<PackageVersion Include="Polly" Version="8.8.0" />
Expand Down
2 changes: 1 addition & 1 deletion NGitLab.Mock.Tests/FileTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ await filesClient.GetRawAsync(fileToLookUp, async stream =>
}
else
{
Assert.ThrowsAsync<GitLabException>((Func<Task>)(async () => await filesClient.GetRawAsync(fileToLookUp, _ => Task.CompletedTask).ConfigureAwait(false)));
await Assert.ThrowsAsync<GitLabException>((Func<Task>)(async () => await filesClient.GetRawAsync(fileToLookUp, _ => Task.CompletedTask).ConfigureAwait(false)));
}
}
}
8 changes: 4 additions & 4 deletions NGitLab.Mock.Tests/GroupsMockTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,11 @@ public async Task Test_page_groups_with_page_0_returns_page_1()
}

[Test]
public void Test_page_groups_with_invalid_perpage_throws()
public async Task Test_page_groups_with_invalid_perpage_throws()
{
using var server = CreateGroupHierarchy();
var client = server.CreateClient("user1");
Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => client.Groups.PageAsync(new(perPage: 0))));
await Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => client.Groups.PageAsync(new(perPage: 0))));
}

[Test]
Expand Down Expand Up @@ -272,11 +272,11 @@ public async Task Test_page_subgroups_with_page_0_returns_page_1()
}

[Test]
public void Test_page_subgroups_with_invalid_perpage_throws()
public async Task Test_page_subgroups_with_invalid_perpage_throws()
{
using var server = CreateGroupHierarchy();
var client = server.CreateClient("user1");
Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => client.Groups.PageSubgroupsAsync(1, new(page: 1, perPage: 0))));
await Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => client.Groups.PageSubgroupsAsync(1, new(page: 1, perPage: 0))));
}

[Test]
Expand Down
28 changes: 14 additions & 14 deletions NGitLab.Mock.Tests/MembersMockTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,8 @@ public async Task Test_members_async_methods_simulate_gitlab_behavior()
const string groupId = "G1/G2";

// Does NOT search inherited permission by default...
AssertThrowsGitLabException(() => client.Members.GetMemberOfProjectAsync(projectId, user1.Id), System.Net.HttpStatusCode.NotFound);
AssertThrowsGitLabException(() => client.Members.GetMemberOfGroupAsync(groupId, user1.Id), System.Net.HttpStatusCode.NotFound);
await AssertThrowsGitLabException(() => client.Members.GetMemberOfProjectAsync(projectId, user1.Id), System.Net.HttpStatusCode.NotFound);
await AssertThrowsGitLabException(() => client.Members.GetMemberOfGroupAsync(groupId, user1.Id), System.Net.HttpStatusCode.NotFound);
Assert.That(client.Members.OfProjectAsync(projectId).AsEnumerable().Select(m => m.UserName), Is.Empty);
Assert.That(client.Members.OfGroupAsync(groupId).AsEnumerable().Select(m => m.UserName), Is.EquivalentTo([ownerName]));

Expand All @@ -128,20 +128,20 @@ public async Task Test_members_async_methods_simulate_gitlab_behavior()
Assert.That(client.Members.OfGroupAsync(groupId, includeInheritedMembers: true).AsEnumerable().Select(m => m.UserName), Is.EquivalentTo([ownerName, user1Name]));

// Cannot update non-existent membership...
AssertThrowsGitLabException(() => client.Members.UpdateMemberOfProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Owner }), System.Net.HttpStatusCode.NotFound);
AssertThrowsGitLabException(() => client.Members.UpdateMemberOfGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Owner }), System.Net.HttpStatusCode.NotFound);
await AssertThrowsGitLabException(() => client.Members.UpdateMemberOfProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Owner }), System.Net.HttpStatusCode.NotFound);
await AssertThrowsGitLabException(() => client.Members.UpdateMemberOfGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Owner }), System.Net.HttpStatusCode.NotFound);

// Cannot add membership with an access-level lower than inherited...
AssertThrowsGitLabException(() => client.Members.AddMemberToProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Reporter }), System.Net.HttpStatusCode.BadRequest);
AssertThrowsGitLabException(() => client.Members.AddMemberToGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Reporter }), System.Net.HttpStatusCode.BadRequest);
await AssertThrowsGitLabException(() => client.Members.AddMemberToProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Reporter }), System.Net.HttpStatusCode.BadRequest);
await AssertThrowsGitLabException(() => client.Members.AddMemberToGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Reporter }), System.Net.HttpStatusCode.BadRequest);

// Can add membership with greater than or equal access-level...
await AssertReturnsMembership(() => client.Members.AddMemberToProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Maintainer }), Models.AccessLevel.Maintainer);
await AssertReturnsMembership(() => client.Members.AddMemberToGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Maintainer }), Models.AccessLevel.Maintainer);

// Cannot add duplicate membership...
AssertThrowsGitLabException(() => client.Members.AddMemberToProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Owner }), System.Net.HttpStatusCode.Conflict);
AssertThrowsGitLabException(() => client.Members.AddMemberToGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Owner }), System.Net.HttpStatusCode.Conflict);
await AssertThrowsGitLabException(() => client.Members.AddMemberToProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Owner }), System.Net.HttpStatusCode.Conflict);
await AssertThrowsGitLabException(() => client.Members.AddMemberToGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Owner }), System.Net.HttpStatusCode.Conflict);

// Can raise access-level above inherited...
await AssertReturnsMembership(() => client.Members.UpdateMemberOfProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Owner }), Models.AccessLevel.Owner);
Expand All @@ -152,16 +152,16 @@ public async Task Test_members_async_methods_simulate_gitlab_behavior()
await AssertReturnsMembership(() => client.Members.UpdateMemberOfGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Maintainer }), Models.AccessLevel.Maintainer);

// Cannot decrease access-level lower than inherited...
AssertThrowsGitLabException(() => client.Members.UpdateMemberOfProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Reporter }), System.Net.HttpStatusCode.BadRequest);
AssertThrowsGitLabException(() => client.Members.UpdateMemberOfGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Reporter }), System.Net.HttpStatusCode.BadRequest);
await AssertThrowsGitLabException(() => client.Members.UpdateMemberOfProjectAsync(projectId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Reporter }), System.Net.HttpStatusCode.BadRequest);
await AssertThrowsGitLabException(() => client.Members.UpdateMemberOfGroupAsync(groupId, new() { UserId = user1Id, AccessLevel = Models.AccessLevel.Reporter }), System.Net.HttpStatusCode.BadRequest);

// Can delete...
await client.Members.RemoveMemberFromProjectAsync(projectId, user1.Id);
await client.Members.RemoveMemberFromGroupAsync(groupId, user1.Id);

// Delete fails when not exist...
AssertThrowsGitLabException(() => client.Members.RemoveMemberFromProjectAsync(projectId, user1.Id), System.Net.HttpStatusCode.NotFound);
AssertThrowsGitLabException(() => client.Members.RemoveMemberFromGroupAsync(groupId, user1.Id), System.Net.HttpStatusCode.NotFound);
await AssertThrowsGitLabException(() => client.Members.RemoveMemberFromProjectAsync(projectId, user1.Id), System.Net.HttpStatusCode.NotFound);
await AssertThrowsGitLabException(() => client.Members.RemoveMemberFromGroupAsync(groupId, user1.Id), System.Net.HttpStatusCode.NotFound);
}

private static async Task AssertReturnsMembership(Func<Task<Models.Membership>> code, Models.AccessLevel expectedAccessLevel)
Expand All @@ -171,9 +171,9 @@ private static async Task AssertReturnsMembership(Func<Task<Models.Membership>>
Assert.That(membership.AccessLevel, Is.EqualTo((int)expectedAccessLevel));
}

private static void AssertThrowsGitLabException(AsyncTestDelegate code, System.Net.HttpStatusCode expectedStatusCode)
private static async Task AssertThrowsGitLabException(Func<Task> code, System.Net.HttpStatusCode expectedStatusCode)
{
var ex = Assert.CatchAsync(typeof(GitLabException), code) as GitLabException;
var ex = await Assert.CatchAsync(typeof(GitLabException), code).ConfigureAwait(false) as GitLabException;
Assert.That(ex, Is.Not.Null);
Assert.That(ex.StatusCode, Is.EqualTo(expectedStatusCode));
}
Expand Down
30 changes: 15 additions & 15 deletions NGitLab.Mock.Tests/ProjectsMockTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public void Test_projects_created_can_be_found()
}

[Test]
public void GetProjectAsync_WhenProjectDoesNotExist_ShouldThrowNotFound()
public async Task GetProjectAsync_WhenProjectDoesNotExist_ShouldThrowNotFound()
{
// Arrange
using var server = new GitLabConfig()
Expand All @@ -59,13 +59,13 @@ public void GetProjectAsync_WhenProjectDoesNotExist_ShouldThrowNotFound()
var projectClient = gitLabClient.Projects;

// Act/Assert
var ex = Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => projectClient.GetAsync("baz1234")));
var ex = await Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => projectClient.GetAsync("baz1234")));

Assert.That(ex.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}

[Test]
public void GetProjectAsync_WhenProjectInaccessible_ShouldThrowNotFound()
public async Task GetProjectAsync_WhenProjectInaccessible_ShouldThrowNotFound()
{
// Arrange
using var server = new GitLabConfig()
Expand All @@ -82,7 +82,7 @@ public void GetProjectAsync_WhenProjectInaccessible_ShouldThrowNotFound()
});

// Act/Assert
var ex = Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => testUser1ProjectClient.GetAsync(testUser2Project.Id)));
var ex = await Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => testUser1ProjectClient.GetAsync(testUser2Project.Id)));

Assert.That(ex.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
Expand Down Expand Up @@ -302,7 +302,7 @@ public async Task CreateAsync_WhenInitializeWithReadmeIsFalse_ItIgnoresDefaultBr
}

[Test]
public void CreateAsync_WhenProjectPathAlreadyExists_ItThrows()
public async Task CreateAsync_WhenProjectPathAlreadyExists_ItThrows()
{
// Arrange
using var server = new GitLabConfig()
Expand All @@ -313,7 +313,7 @@ public void CreateAsync_WhenProjectPathAlreadyExists_ItThrows()
var projectClient = server.CreateClient().Projects;

// Act
var ex = Assert.CatchAsync<GitLabException>((Func<Task>)(() =>
var ex = await Assert.CatchAsync<GitLabException>((Func<Task>)(() =>
projectClient.CreateAsync(new()
{
Path = "DUPLICATE", // GitLab path is case-INsensitive
Expand All @@ -326,7 +326,7 @@ public void CreateAsync_WhenProjectPathAlreadyExists_ItThrows()
}

[Test]
public void CreateAsync_WhenProjectNameAlreadyExists_ItThrows()
public async Task CreateAsync_WhenProjectNameAlreadyExists_ItThrows()
{
// Arrange
using var server = new GitLabConfig()
Expand All @@ -337,7 +337,7 @@ public void CreateAsync_WhenProjectNameAlreadyExists_ItThrows()
var projectClient = server.CreateClient().Projects;

// Act
var ex = Assert.ThrowsAsync<GitLabException>((Func<Task>)(() =>
var ex = await Assert.ThrowsAsync<GitLabException>((Func<Task>)(() =>
projectClient.CreateAsync(new()
{
Path = "project2",
Expand Down Expand Up @@ -476,7 +476,7 @@ await projectClient.UpdateAsync(
}

[Test]
public void UpdateAsync_WhenProjectNotFound_ItThrows()
public async Task UpdateAsync_WhenProjectNotFound_ItThrows()
{
// Arrange
using var server = new GitLabConfig()
Expand All @@ -486,7 +486,7 @@ public void UpdateAsync_WhenProjectNotFound_ItThrows()
var projectClient = server.CreateClient().Projects;

// Act
var ex = Assert.CatchAsync<GitLabException>((Func<Task>)(() =>
var ex = await Assert.CatchAsync<GitLabException>((Func<Task>)(() =>
projectClient.UpdateAsync(int.MaxValue, new()
{
Visibility = VisibilityLevel.Private,
Expand Down Expand Up @@ -516,7 +516,7 @@ public async Task DeleteAsync_WhenProjectExists_MarksProjectForDeletion()
}

[Test]
public void DeleteAsync_WhenProjectNotFound_ItThrows()
public async Task DeleteAsync_WhenProjectNotFound_ItThrows()
{
using var server = new GitLabConfig()
.WithUser("Test", isDefault: true)
Expand All @@ -525,7 +525,7 @@ public void DeleteAsync_WhenProjectNotFound_ItThrows()
var projectClient = server.CreateClient().Projects;

// Act
var ex = Assert.CatchAsync<GitLabException>((Func<Task>)(() => projectClient.DeleteAsync(int.MaxValue)));
var ex = await Assert.CatchAsync<GitLabException>((Func<Task>)(() => projectClient.DeleteAsync(int.MaxValue)));

// Assert
Assert.That(ex.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
Expand Down Expand Up @@ -576,7 +576,7 @@ public async Task DeleteAsync_WithPermanentlyRemove_AndMatchingFullPath_HardDele
});

// Assert: project is now gone
Assert.CatchAsync<GitLabException>((Func<Task>)(() => projectClient.GetAsync(project.Id)));
await Assert.CatchAsync<GitLabException>((Func<Task>)(() => projectClient.GetAsync(project.Id)));
}

[Test]
Expand All @@ -595,7 +595,7 @@ public async Task DeleteAsync_WithPermanentlyRemove_AndMismatchedFullPath_Throws
await projectClient.DeleteAsync(project.Id);

// Act: wrong full_path
var ex = Assert.CatchAsync<GitLabException>((Func<Task>)(() =>
var ex = await Assert.CatchAsync<GitLabException>((Func<Task>)(() =>
projectClient.DeleteAsync(project.Id, new ProjectDelete
{
PermanentlyRemove = true,
Expand All @@ -622,7 +622,7 @@ public async Task PermanentlyDeleteAsync_HardDeletesProjectInOneCall()
await projectClient.PermanentlyDeleteAsync(project.Id);

// Assert: project is gone
Assert.CatchAsync<GitLabException>((Func<Task>)(() => projectClient.GetAsync(project.Id)));
await Assert.CatchAsync<GitLabException>((Func<Task>)(() => projectClient.GetAsync(project.Id)));
}

[Test]
Expand Down
2 changes: 1 addition & 1 deletion NGitLab.Mock.Tests/TagTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public async Task GetTagAsync()
var tag = await tagClient.GetByNameAsync("1.0.0");
Assert.That(tag.Name, Is.EqualTo("1.0.0"));

var ex = Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => tagClient.GetByNameAsync("1.0.1")));
var ex = await Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => tagClient.GetByNameAsync("1.0.1")));
Assert.That(ex.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}

Expand Down
4 changes: 2 additions & 2 deletions NGitLab.Tests/FilesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public async Task Test_add_update_delete_get_and_exists_file_async()
exists = await filesClient.FileExistsAsync(fileName, project.DefaultBranch);
Assert.That(exists, Is.False);

Assert.ThrowsAsync(Is.InstanceOf<GitLabException>(), (Func<Task>)(() => filesClient.GetAsync("testDelete.md", project.DefaultBranch)));
await Assert.ThrowsAsync(Is.InstanceOf<GitLabException>(), (Func<Task>)(() => filesClient.GetAsync("testDelete.md", project.DefaultBranch)));
}

[Test]
Expand Down Expand Up @@ -136,7 +136,7 @@ await filesClient.GetRawAsync(fileName, async stream =>
Assert.That(downloadedContent, Is.Not.Null);
Assert.That(downloadedContent, Is.EqualTo("test"));

Assert.ThrowsAsync(Is.InstanceOf<GitLabException>(), (Func<Task>)(() => filesClient.GetRawAsync("does-not-exist.md", _ => Task.CompletedTask)));
await Assert.ThrowsAsync(Is.InstanceOf<GitLabException>(), (Func<Task>)(() => filesClient.GetRawAsync("does-not-exist.md", _ => Task.CompletedTask)));
}

[Test]
Expand Down
2 changes: 1 addition & 1 deletion NGitLab.Tests/GraphQLTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public async Task Test_invalid_request()
using var context = await GitLabTestContext.CreateAsync();
var project = context.CreateProject();

var exception = Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => context.Client.GraphQL.ExecuteAsync<ProjectResponse>(new GraphQLQuery
var exception = await Assert.ThrowsAsync<GitLabException>((Func<Task>)(() => context.Client.GraphQL.ExecuteAsync<ProjectResponse>(new GraphQLQuery
{
Query = """
{
Expand Down
Loading
Loading