Skip to content

Commit

Permalink
Add IUserClient.CreateTokenAsync() and Group.CreatedAt prop (#665)
Browse files Browse the repository at this point in the history
* Add IUserClient.CreateTokenAsync()

* Add Group.CreatedOn property.
  • Loading branch information
belcher-rok authored May 1, 2024
1 parent 6f5dc8a commit c8418b2
Show file tree
Hide file tree
Showing 10 changed files with 112 additions and 5 deletions.
23 changes: 22 additions & 1 deletion NGitLab.Mock.Tests/GroupsMockTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Linq;
using System.Threading.Tasks;
using NGitLab.Mock.Config;
Expand Down Expand Up @@ -406,4 +406,25 @@ public void Test_create_update_delete_group_hooks()
// Assert
Assert.That(groupHooksClient.All.ToArray(), Is.Empty);
}

[Test]
public async Task Test_group_created_at_date()
{
using var server = new GitLabConfig()
.WithUser("user1", isDefault: true)
.BuildServer();

var client = server.CreateClient("user1");

var t1 = DateTime.UtcNow;
var group = await client.Groups.CreateAsync(new Models.GroupCreate
{
Name = "Foo",
Path = "foo",
});
var t2 = DateTime.UtcNow;

Assert.That(group.CreatedAt, Is.GreaterThanOrEqualTo(t1));
Assert.That(group.CreatedAt, Is.LessThanOrEqualTo(t2));
}
}
6 changes: 6 additions & 0 deletions NGitLab.Mock/Clients/UserClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ public UserToken CreateToken(UserTokenCreate tokenRequest)
throw new NotSupportedException();
}

public async Task<UserToken> CreateTokenAsync(UserTokenCreate tokenRequest, CancellationToken cancellationToken = default)
{
await Task.Yield();
return CreateToken(tokenRequest);
}

public void Delete(int id)
{
using (Context.BeginOperationScope())
Expand Down
3 changes: 3 additions & 0 deletions NGitLab.Mock/Group.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ public IEnumerable<Group> DescendantGroups
}
}

public DateTime CreatedAt { get; set; } = DateTime.UtcNow;

public IEnumerable<Project> AllProjects => Projects.Concat(DescendantGroups.SelectMany(group => group.Projects));

public EffectivePermissions GetEffectivePermissions() => GetEffectivePermissions(includeInheritedPermissions: true);
Expand Down Expand Up @@ -259,6 +261,7 @@ public Models.Group ToClientGroup(User currentUser)
LfsEnabled = LfsEnabled,
ExtraSharedRunnersMinutesLimit = (int)ExtraSharedRunnersLimit.TotalMinutes,
SharedRunnersMinutesLimit = (int)SharedRunnersLimit.TotalMinutes,
CreatedAt = CreatedAt,
};
}

Expand Down
2 changes: 2 additions & 0 deletions NGitLab.Mock/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,8 @@ NGitLab.Mock.Group.CanUserDeleteGroup(NGitLab.Mock.User user) -> bool
NGitLab.Mock.Group.CanUserEditGroup(NGitLab.Mock.User user) -> bool
NGitLab.Mock.Group.CanUserViewGroup(NGitLab.Mock.User user) -> bool
NGitLab.Mock.Group.CreateBotUser(NGitLab.Models.AccessLevel accessLevel) -> NGitLab.Mock.User
NGitLab.Mock.Group.CreatedAt.get -> System.DateTime
NGitLab.Mock.Group.CreatedAt.set -> void
NGitLab.Mock.Group.DescendantGroups.get -> System.Collections.Generic.IEnumerable<NGitLab.Mock.Group>
NGitLab.Mock.Group.Description.get -> string
NGitLab.Mock.Group.Description.set -> void
Expand Down
17 changes: 17 additions & 0 deletions NGitLab.Tests/GroupsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,23 @@ public async Task Test_get_group_by_fullpath()
Assert.That(group, Is.Not.Null);
}

[Test]
[NGitLabRetry]
public async Task Test_group_created_on_date_is_now()
{
using var context = await GitLabTestContext.CreateAsync();

var t1 = DateTime.UtcNow;
var group = context.CreateGroup();
var t2 = DateTime.UtcNow;

Assert.That(group.CreatedAt, Is.GreaterThanOrEqualTo(t1));
Assert.That(group.CreatedAt, Is.LessThanOrEqualTo(t2));

var group2 = await context.Client.Groups.GetByIdAsync(group.Id);
Assert.That(group2.CreatedAt, Is.EqualTo(group.CreatedAt));
}

[Test]
[NGitLabRetry]
public async Task Test_create_delete_group()
Expand Down
41 changes: 41 additions & 0 deletions NGitLab.Tests/UsersTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,47 @@ public async Task CreateTokenAsAdmin_ReturnsUserToken()
Assert.That(tokenResult.Name, Is.EqualTo(tokenRequest.Name));
}

[Test]
[NGitLabRetry]
public async Task CreateTokenAsyncAsAdmin_ReturnsUserToken()
{
using var context = await GitLabTestContext.CreateAsync();
var users = context.AdminClient.Users;

var tokenRequest = new UserTokenCreate
{
UserId = users.Current.Id,
Name = FormattableString.Invariant($"Test_Create_{DateTime.UtcNow:yyyyMMddHHmmss}"),
ExpiresAt = DateTime.UtcNow.AddDays(1),
Scopes = new[] { "api", "read_user" },
};

var tokenResult = await users.CreateTokenAsync(tokenRequest);

Assert.That(tokenResult.Token, Is.Not.Empty);
Assert.That(tokenResult.Name, Is.EqualTo(tokenRequest.Name));
}

[Test]
[NGitLabRetry]
public async Task CreateTokenAsyncAsAdmin_WhenUserNotFound_ItThrowsBadRequest()
{
using var context = await GitLabTestContext.CreateAsync();
var users = context.AdminClient.Users;

var tokenRequest = new UserTokenCreate
{
UserId = int.MaxValue,
Name = "foo",
ExpiresAt = DateTime.UtcNow.Date.AddDays(7),
Scopes = new[] { "write_repository" },
};

var ex = Assert.ThrowsAsync<GitLabException>(() => users.CreateTokenAsync(tokenRequest));
Assert.That(ex.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
Assert.That(ex.ErrorMessage, Is.EqualTo("404 User Not Found"));
}

[Test]
[NGitLabRetry]
public async Task GetLastActivityDates()
Expand Down
10 changes: 8 additions & 2 deletions NGitLab/IUserClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,16 @@ public interface IUserClient

/// <summary>
/// Request a token for user impersonation.
/// Admin account/token is required for impersonation
/// Requires an Admin account/token.
/// <para/>
/// See https://docs.gitlab.com/ee/api/users.html#create-an-impersonation-token
/// </summary>
/// <param name="tokenRequest">info required to create the token</param>
/// <returns></returns>
/// <param name="cancellationToken">Optional cancellation token.</param>
/// <returns>The new impersonation token.</returns>
public Task<UserToken> CreateTokenAsync(UserTokenCreate tokenRequest, CancellationToken cancellationToken = default);

/// <inheritdoc cref="CreateTokenAsync(UserTokenCreate, CancellationToken)"/>>
UserToken CreateToken(UserTokenCreate tokenRequest);

void Delete(int id);
Expand Down
6 changes: 5 additions & 1 deletion NGitLab/Impl/UserClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,11 @@ public IEnumerable<User> Get(UserQuery query)

public Task<User> CreateAsync(UserUpsert user, CancellationToken cancellationToken = default) => _api.Post().With(user).ToAsync<User>(User.Url, cancellationToken);

public UserToken CreateToken(UserTokenCreate tokenRequest) => _api.Post().With(tokenRequest).To<UserToken>(User.Url + "/" + tokenRequest.UserId.ToStringInvariant() + "/impersonation_tokens");
public UserToken CreateToken(UserTokenCreate tokenRequest) =>
_api.Post().With(tokenRequest).To<UserToken>($"{User.Url}/{tokenRequest.UserId.ToStringInvariant()}/impersonation_tokens");

public Task<UserToken> CreateTokenAsync(UserTokenCreate tokenRequest, CancellationToken cancellationToken = default) =>
_api.Post().With(tokenRequest).ToAsync<UserToken>($"{User.Url}/{tokenRequest.UserId.ToStringInvariant()}/impersonation_tokens", cancellationToken);

public User Update(int id, UserUpsert user) => _api.Put().With(user).To<User>(User.Url + "/" + id.ToStringInvariant());

Expand Down
6 changes: 5 additions & 1 deletion NGitLab/Models/Group.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Text.Json.Serialization;
using System;
using System.Text.Json.Serialization;

namespace NGitLab.Models;

Expand Down Expand Up @@ -50,4 +51,7 @@ public class Group

[JsonPropertyName("marked_for_deletion_on")]
public string MarkedForDeletionOn;

[JsonPropertyName("created_at")]
public DateTime CreatedAt;
}
3 changes: 3 additions & 0 deletions NGitLab/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -965,6 +965,7 @@ NGitLab.Impl.UserClient.All.get -> System.Collections.Generic.IEnumerable<NGitLa
NGitLab.Impl.UserClient.Create(NGitLab.Models.UserUpsert user) -> NGitLab.Models.User
NGitLab.Impl.UserClient.CreateAsync(NGitLab.Models.UserUpsert user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.User>
NGitLab.Impl.UserClient.CreateToken(NGitLab.Models.UserTokenCreate tokenRequest) -> NGitLab.Models.UserToken
NGitLab.Impl.UserClient.CreateTokenAsync(NGitLab.Models.UserTokenCreate tokenRequest, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.UserToken>
NGitLab.Impl.UserClient.Current.get -> NGitLab.Models.Session
NGitLab.Impl.UserClient.CurrentUserSShKeys.get -> NGitLab.ISshKeyClient
NGitLab.Impl.UserClient.Deactivate(int userId) -> void
Expand Down Expand Up @@ -1180,6 +1181,7 @@ NGitLab.IUserClient.All.get -> System.Collections.Generic.IEnumerable<NGitLab.Mo
NGitLab.IUserClient.Create(NGitLab.Models.UserUpsert user) -> NGitLab.Models.User
NGitLab.IUserClient.CreateAsync(NGitLab.Models.UserUpsert user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.User>
NGitLab.IUserClient.CreateToken(NGitLab.Models.UserTokenCreate tokenRequest) -> NGitLab.Models.UserToken
NGitLab.IUserClient.CreateTokenAsync(NGitLab.Models.UserTokenCreate tokenRequest, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.UserToken>
NGitLab.IUserClient.Current.get -> NGitLab.Models.Session
NGitLab.IUserClient.CurrentUserSShKeys.get -> NGitLab.ISshKeyClient
NGitLab.IUserClient.Deactivate(int id) -> void
Expand Down Expand Up @@ -1855,6 +1857,7 @@ NGitLab.Models.GraphQLQuery.Query.set -> void
NGitLab.Models.GraphQLQuery.Variables.get -> System.Collections.Generic.IDictionary<string, object>
NGitLab.Models.Group
NGitLab.Models.Group.AvatarUrl -> string
NGitLab.Models.Group.CreatedAt -> System.DateTime
NGitLab.Models.Group.Description -> string
NGitLab.Models.Group.ExtraSharedRunnersMinutesLimit -> int?
NGitLab.Models.Group.FullName -> string
Expand Down

0 comments on commit c8418b2

Please sign in to comment.