Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix HTTP PAT tests and implementation #21

Merged
merged 1 commit into from
Sep 17, 2024
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
6 changes: 1 addition & 5 deletions Iggy_SDK/Contracts/Http/Auth/AuthResponse.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
namespace Iggy_SDK.Contracts.Http;

public record AuthResponse(int UserId, TokenInfo AccessToken)
{
// public required int UserId { get; init; }
// public TokenInfo AccessToken { get; init; }
}
public record AuthResponse(int UserId, TokenInfo AccessToken);
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ namespace Iggy_SDK.Contracts.Http;
public sealed class PersonalAccessTokenResponse
{
public required string Name { get; init; }
public DateTimeOffset? Expiry { get; init; }
public DateTimeOffset? ExpiryAt { get; init; }
}
43 changes: 21 additions & 22 deletions Iggy_SDK/IggyClient/Implementations/HttpMessageStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -622,27 +622,26 @@ public async Task DeletePersonalAccessTokenAsync(DeletePersonalAccessTokenReques
}
public async Task<AuthResponse?> LoginWithPersonalAccessToken(LoginWithPersonalAccessToken request, CancellationToken token = default)
{
// var json = JsonSerializer.Serialize(request, JsonConverterFactory.SnakeCaseOptions);
// var content = new StringContent(json, Encoding.UTF8, "application/json");
// var response = await _httpClient.PostAsync("/personal-access-tokens/login", content, token);
// if (response.IsSuccessStatusCode)
// {
// var authResponse = await response.Content.ReadFromJsonAsync<AuthResponse>(JsonConverterFactory.AuthResponseOptions, cancellationToken: token);
// var jwtToken = authResponse!.Tokens?.AccessToken?.Token;
// if (!string.IsNullOrEmpty(authResponse!.Tokens!.AccessToken!.Token))
// {
// _httpClient.DefaultRequestHeaders.Authorization =
// new AuthenticationHeaderValue("Bearer", jwtToken);
// }
// else
// {
// throw new Exception("The JWT token is missing.");
// }
// return authResponse;
// }
// await HandleResponseAsync(response);
// return null;

throw new NotImplementedException();
var json = JsonSerializer.Serialize(request, JsonConverterFactory.SnakeCaseOptions);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("/personal-access-tokens/login", content, token);
if (response.IsSuccessStatusCode)
{
var authResponse = await response.Content.ReadFromJsonAsync<AuthResponse>(JsonConverterFactory.AuthResponseOptions, cancellationToken: token);
var jwtToken = authResponse!.AccessToken?.Token;
if (!string.IsNullOrEmpty(authResponse!.AccessToken!.Token))
{
_httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", jwtToken);
}
else
{
throw new Exception("The JWT token is missing.");
}
return authResponse;
}
await HandleResponseAsync(response);

return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public sealed class PersonalAccessTokenResponseConverter : JsonConverter<Persona
var root = doc.RootElement;

var name = root.GetProperty(nameof(PersonalAccessTokenResponse.Name).ToSnakeCase()).GetString();
root.TryGetProperty(nameof(PersonalAccessTokenResponse.Expiry).ToSnakeCase(), out var expiryElement);
root.TryGetProperty(nameof(PersonalAccessTokenResponse.ExpiryAt).ToSnakeCase(), out var expiryElement);
DateTimeOffset? expiry = expiryElement.ValueKind switch
{
JsonValueKind.Null => null,
Expand All @@ -23,7 +23,7 @@ public sealed class PersonalAccessTokenResponseConverter : JsonConverter<Persona
return new PersonalAccessTokenResponse
{
Name = name!,
Expiry = expiry
ExpiryAt = expiry
};
}
public override void Write(Utf8JsonWriter writer, PersonalAccessTokenResponse value, JsonSerializerOptions options)
Expand Down
2 changes: 1 addition & 1 deletion Iggy_SDK/Mappers/BinaryMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ private static (PersonalAccessTokenResponse response, int position) MapToPersona
return (new PersonalAccessTokenResponse
{
Name = name,
Expiry = expiry == 0 ? null : DateTimeOffsetUtils.FromUnixTimeMicroSeconds(expiry).LocalDateTime
ExpiryAt = expiry == 0 ? null : DateTimeOffsetUtils.FromUnixTimeMicroSeconds(expiry).LocalDateTime
}, readBytes);
}
internal static IReadOnlyList<UserResponse> MapUsers(ReadOnlySpan<byte> payload)
Expand Down
1 change: 1 addition & 0 deletions Iggy_SDK_Tests/E2ETests/Fixtures/IggyBaseFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public abstract class IggyBaseFixture : IAsyncLifetime
.WithPortBinding(3000, true)
.WithOutputConsumer(Consume.RedirectStdoutAndStderrToConsole())
.WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(3000))
.WithCleanUp(true)
.Build();

public IIggyClient[] SubjectsUnderTest { get; } = new IIggyClient[2];
Expand Down
158 changes: 111 additions & 47 deletions Iggy_SDK_Tests/E2ETests/PATE2E.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,76 +20,140 @@ public PATE2E(IggyPATFixture fixture)
_fixture = fixture;
}

[Fact(Skip = SkipMessage), TestPriority(1)]
[Fact, TestPriority(1)]
public async Task CreatePersonalAccessToken_HappyPath_Should_CreatePersonalAccessToken_Successfully()
{
var tasks = _fixture.SubjectsUnderTest.Select(sut => Task.Run(async () =>
{
await sut.Invoking(x => x.CreatePersonalAccessTokenAsync(PATFixtureBootstrap.CreatePersonalAccessTokenRequest))
.Should()
.NotThrowAsync();
})).ToArray();
await Task.WhenAll(tasks);
// act & assert
await _fixture.HttpSut.Invoking(y =>
y.CreatePersonalAccessTokenAsync(PATFixtureBootstrap.CreatePersonalAccessTokenRequest)
).Should()
.NotThrowAsync();

// TODO: This code block is commmented bacause TCP implementation is not working properly.
// var tasks = _fixture.SubjectsUnderTest.Select(sut => Task.Run(async () =>
// {
// await sut.Invoking(x => x.CreatePersonalAccessTokenAsync(PATFixtureBootstrap.CreatePersonalAccessTokenRequest))
// .Should()
// .NotThrowAsync();
// })).ToArray();
//
// await Task.WhenAll(tasks);
}

[Fact(Skip = SkipMessage), TestPriority(2)]
[Fact, TestPriority(2)]
public async Task CreatePersonalAccessToken_Duplicate_Should_Throw_InvalidResponse()
{
var tasks = _fixture.SubjectsUnderTest.Select(sut => Task.Run(async () =>
{
await sut.Invoking(x => x.CreatePersonalAccessTokenAsync(PATFixtureBootstrap.CreatePersonalAccessTokenRequest))
.Should()
.ThrowExactlyAsync<InvalidResponseException>();
})).ToArray();
await Task.WhenAll(tasks);
// act & assert
await _fixture.HttpSut.Invoking(y =>
y.CreatePersonalAccessTokenAsync(PATFixtureBootstrap.CreatePersonalAccessTokenRequest)
).Should()
.ThrowExactlyAsync<InvalidResponseException>();

// TODO: This code block is commmented bacause TCP implementation is not working properly.
// var tasks = _fixture.SubjectsUnderTest.Select(sut => Task.Run(async () =>
// {
// await sut.Invoking(x => x.CreatePersonalAccessTokenAsync(PATFixtureBootstrap.CreatePersonalAccessTokenRequest))
// .Should()
// .ThrowExactlyAsync<InvalidResponseException>();
// })).ToArray();
//
// await Task.WhenAll(tasks);
}

[Fact(Skip = SkipMessage), TestPriority(3)]
[Fact, TestPriority(3)]
public async Task GetPersonalAccessTokens_Should_ReturnValidResponse()
{
var tasks = _fixture.SubjectsUnderTest.Select( sut => Task.Run(async () =>
{
var response = await sut.GetPersonalAccessTokensAsync();
response.Should().NotBeNull();
response.Count.Should().Be(1);
response[0].Name.Should().Be(PATFixtureBootstrap.CreatePersonalAccessTokenRequest.Name);
var tokenExpiryDateTimeOffset = DateTime.UtcNow.AddSeconds((double)PATFixtureBootstrap.CreatePersonalAccessTokenRequest.Expiry!).ToDateTimeOffset();
response[0].Expiry!.Value.Date.Should().Be(tokenExpiryDateTimeOffset.Date);
})).ToArray();
await Task.WhenAll(tasks);
// arrange
var expectedTokenExpiryLocaltime = DateTime.UtcNow.AddMicroseconds((double)PATFixtureBootstrap.CreatePersonalAccessTokenRequest.Expiry!).ToLocalTime();
var expectedPersonalTokenName = PATFixtureBootstrap.CreatePersonalAccessTokenRequest.Name;

// act
var response = await _fixture.HttpSut.GetPersonalAccessTokensAsync();

// assert
response.Should()
.NotBeNull()
.And
.NotBeEmpty()
.And
.ContainSingle(x =>
x.Name.Equals(expectedPersonalTokenName) &&
x.ExpiryAt!.Value.Date == expectedTokenExpiryLocaltime.Date);

// TODO: This code block is commmented bacause TCP implementation is not working properly.
// var tasks = _fixture.SubjectsUnderTest.Select( sut => Task.Run(async () =>
// {
// var response = await sut.GetPersonalAccessTokensAsync();
// response.Should().NotBeNull();
// response.Count.Should().Be(1);
// response[0].Name.Should().Be(PATFixtureBootstrap.CreatePersonalAccessTokenRequest.Name);
// var tokenExpiryDateTimeOffset = DateTime.UtcNow.AddSeconds((double)PATFixtureBootstrap.CreatePersonalAccessTokenRequest.Expiry!).ToDateTimeOffset();
// response[0].Expiry!.Value.Date.Should().Be(tokenExpiryDateTimeOffset.Date);
// })).ToArray();
//
// await Task.WhenAll(tasks);
}

[Fact(Skip = SkipMessage), TestPriority(4)]
[Fact, TestPriority(4)]
public async Task LoginWithPersonalAccessToken_Should_Be_Successfull()
{
var tasks = _fixture.SubjectsUnderTest.Select(sut => Task.Run(async () =>
// act
var response = await _fixture.HttpSut.CreatePersonalAccessTokenAsync(new CreatePersonalAccessTokenRequest
{
var response = await sut.CreatePersonalAccessTokenAsync(new CreatePersonalAccessTokenRequest
{
Name = "test-login",
Expiry = 69420
});
await sut.LogoutUser();
await sut.Invoking(x => x.LoginWithPersonalAccessToken(new LoginWithPersonalAccessToken
{
Token = response!.Token
})).Should().NotThrowAsync();
})).ToArray();
await Task.WhenAll(tasks);
Name = "test-login",
Expiry = 1726574121
});

await _fixture.HttpSut.LogoutUser();

// assert
await _fixture.HttpSut.Invoking(x => x.LoginWithPersonalAccessToken(new LoginWithPersonalAccessToken
{
Token = response!.Token
}))
.Should()
.NotThrowAsync();

// TODO: This code block is commmented bacause TCP implementation is not working properly.
// var tasks = _fixture.SubjectsUnderTest.Select(sut => Task.Run(async () =>
// {
// var response = await sut.CreatePersonalAccessTokenAsync(new CreatePersonalAccessTokenRequest
// {
// Name = "test-login",
// Expiry = 69420
// });
// await sut.LogoutUser();
// await sut.Invoking(x => x.LoginWithPersonalAccessToken(new LoginWithPersonalAccessToken
// {
// Token = response!.Token
// })).Should().NotThrowAsync();
// })).ToArray();
//
// await Task.WhenAll(tasks);
}

[Fact(Skip = SkipMessage), TestPriority(5)]
[Fact, TestPriority(5)]
public async Task DeletePersonalAccessToken_Should_DeletePersonalAccessToken_Successfully()
{
var tasks = _fixture.SubjectsUnderTest.Select(sut => Task.Run(async () =>
{
await sut.Invoking(x => x.DeletePersonalAccessTokenAsync(new DeletePersonalAccessTokenRequest
// act & assert
await _fixture.HttpSut.Invoking(x => x.DeletePersonalAccessTokenAsync(new DeletePersonalAccessTokenRequest
{
Name = PATFixtureBootstrap.CreatePersonalAccessTokenRequest.Name
}))
.Should()
.NotThrowAsync();
})).ToArray();
await Task.WhenAll(tasks);

// TODO: This code block is commmented bacause TCP implementation is not working properly.
// var tasks = _fixture.SubjectsUnderTest.Select(sut => Task.Run(async () =>
// {
// await sut.Invoking(x => x.DeletePersonalAccessTokenAsync(new DeletePersonalAccessTokenRequest
// {
// Name = PATFixtureBootstrap.CreatePersonalAccessTokenRequest.Name
// }))
// .Should()
// .NotThrowAsync();
// })).ToArray();
//
// await Task.WhenAll(tasks);
}
}
2 changes: 1 addition & 1 deletion Iggy_SDK_Tests/MapperTests/BinaryMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public void MapPersonalAccessTokens_ReturnsValidPersonalAccessTokenResponse()
// Assert
Assert.NotNull(response);
Assert.Equal(name, response[0].Name);
Assert.Equal(assertExpiry, response[0].Expiry);
Assert.Equal(assertExpiry, response[0].ExpiryAt);
}
[Fact]
public void MapOffsets_ReturnsValidOffsetResponse()
Expand Down
Loading