Merged incoming changes
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
using LiteCharms.Features.Hasher;
|
||||
using LiteCharms.Features.Tests.Common;
|
||||
|
||||
namespace LiteCharms.Features.Tests;
|
||||
|
||||
public class HashServiceFeatureTests(Fixture fixture) : IClassFixture<Fixture>
|
||||
{
|
||||
private readonly HashService hashService = fixture.Services.GetRequiredService<HashService>();
|
||||
|
||||
[Fact]
|
||||
public void StringToSha256Hash_Should_GenerateHash()
|
||||
{
|
||||
var input = "We are the best";
|
||||
var expectedHash = "96E17275B53F6BEB7A0D1C4F789F226D3C71CBE398585F25B3028F2B432E78AB";
|
||||
|
||||
var result = HashService.StringToSha256Hash(input);
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.True(HashService.IsSha256Hash(result));
|
||||
Assert.Equal(expectedHash, result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void StreamToSha256Hash_Should_GenerateHash()
|
||||
{
|
||||
var input = "We are successful";
|
||||
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(input));
|
||||
var expectedHash = "C27872EE494B09D72203C98FC858268F3CD3492D62AA7B766A873520C2C73AFB";
|
||||
|
||||
var result = HashService.StreamToSha256Hash(stream);
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.True(HashService.IsSha256Hash(result));
|
||||
Assert.Equal(expectedHash, result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void BytesToSha256Hash_Should_GenerateHash()
|
||||
{
|
||||
var inputBytes = Encoding.UTF8.GetBytes("We are wealthy");
|
||||
var expectedHash = "3876BF98F6E4A8E42B22C40415687D6FF13F0E887F3F508B71852298FC665737";
|
||||
|
||||
var result = HashService.BytesToSha256Hash(inputBytes);
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.True(HashService.IsSha256Hash(result));
|
||||
Assert.Equal(expectedHash, result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToMd5Hash_Should_GenerateHash()
|
||||
{
|
||||
var input = "We manifest our desired destiny";
|
||||
var expectedMd5Lowercase = "6c7816869bcebe4634f7afe9c66dfa08";
|
||||
|
||||
var result = HashService.ToMd5Hash(input);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.True(HashService.IsMd5Hash(result.Value));
|
||||
Assert.Equal(expectedMd5Lowercase, result.Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HashEncodeHex_Should_GenerateHash()
|
||||
{
|
||||
var validHexInput = "DEADBEEF42";
|
||||
|
||||
var result = hashService.HashEncodeHex(validHexInput);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.False(string.IsNullOrWhiteSpace(result.Value));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HashEncodeIntId_Should_GenerateHash()
|
||||
{
|
||||
int targetId = 42;
|
||||
|
||||
var result = hashService.HashEncodeIntId(targetId);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.True(result.Value.Length >= 10);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HashEncodeLongId_Should_GenerateHash()
|
||||
{
|
||||
long targetId = 9904185012L;
|
||||
|
||||
var result = hashService.HashEncodeLongId(targetId);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.True(result.Value.Length >= 10);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DecodeIntIdHash_Should_GenerateHash()
|
||||
{
|
||||
int originalId = 88041;
|
||||
var hashedString = hashService.HashEncodeIntId(originalId).Value;
|
||||
|
||||
var result = hashService.DecodeIntIdHash(hashedString);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.Equal(originalId, result.Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DecodeLongIdHash_Should_GenerateHash()
|
||||
{
|
||||
long originalId = 9081230491823L;
|
||||
var hashedString = hashService.HashEncodeLongId(originalId).Value;
|
||||
|
||||
var result = hashService.DecodeLongIdHash(hashedString);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.Equal(originalId, result.Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DecodeHexHash_Should_GenerateHash()
|
||||
{
|
||||
var originalHex = "ABCDEF12345";
|
||||
var hashedString = hashService.HashEncodeHex(originalHex).Value;
|
||||
|
||||
var result = hashService.DecodeHexHash(hashedString);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.Equal(originalHex, result.Value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<IsPackable>false</IsPackable>
|
||||
<UserSecretsId>62fa604a-1340-4edb-9ddd-3305fcf46fca</UserSecretsId>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="10.0.1">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Mediator.SourceGenerator" Version="3.0.2">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.6.0" />
|
||||
<PackageReference Include="xunit" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Global Usings -->
|
||||
<ItemGroup>
|
||||
<Using Include="System.Net" />
|
||||
<Using Include="System.Text" />
|
||||
<Using Include="Mediator" />
|
||||
<Using Include="Xunit.Abstractions" />
|
||||
<Using Include="Microsoft.Extensions.Options" />
|
||||
<Using Include="Microsoft.Extensions.DependencyInjection" />
|
||||
<Using Include="Microsoft.Extensions.Configuration" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\LiteCharms.Features.Tests.Common\LiteCharms.Features.Tests.Common.csproj" />
|
||||
<ProjectReference Include="..\LiteCharms.Features\LiteCharms.Features.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Using Include="Xunit" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,19 @@
|
||||
using LiteCharms.Features.Api;
|
||||
using LiteCharms.Features.Tests.Common;
|
||||
|
||||
namespace LiteCharms.Features.Tests;
|
||||
|
||||
public sealed class LiteCharmsApiFeatureTests(Fixture fixture) : IClassFixture<Fixture>
|
||||
{
|
||||
private readonly TokenService tokenService = fixture.Services.GetRequiredService<TokenService>();
|
||||
|
||||
[IntegrationFact]
|
||||
public async Task TokenService_GenerateTokenAsync_ShouldReturn_TokenInResult()
|
||||
{
|
||||
var result = await tokenService.GenerateAsync(fixture.CancellationToken);
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotNull(result.Value);
|
||||
Assert.NotEmpty(result.Value.AccessToken!);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
using LiteCharms.Features.Api.Configuration;
|
||||
using LiteCharms.Features.Tests.Common;
|
||||
|
||||
namespace LiteCharms.Features.Tests;
|
||||
|
||||
public sealed class PayfastFeatureTests(Fixture fixture) : IClassFixture<Fixture>
|
||||
{
|
||||
private readonly PayfastSettings payfastSettings = fixture.Services.GetRequiredService<IOptions<PayfastSettings>>().Value;
|
||||
|
||||
[IntegrationFact]
|
||||
public void PayfastSettings_ShouldFail_IfNotLoaded()
|
||||
{
|
||||
Assert.NotEmpty(payfastSettings.CheckoutUrl!);
|
||||
Assert.NotEmpty(payfastSettings.MerchantId!);
|
||||
Assert.NotEmpty(payfastSettings.MerchantKey!);
|
||||
Assert.NotEmpty(payfastSettings.Passphrase!);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using LiteCharms.Features.S3.Abstractions;
|
||||
using LiteCharms.Features.Tests.Common;
|
||||
|
||||
namespace LiteCharms.Features.Tests;
|
||||
|
||||
public class S3ServiceFeatureTests(Fixture fixture, ITestOutputHelper output) : IClassFixture<Fixture>
|
||||
{
|
||||
[Fact]
|
||||
public async Task BookshopS3Service_MustReturnUrl()
|
||||
{
|
||||
var service = fixture.Services.GetKeyedService<IS3Service>(S3.Constants.BookshopBucketName);
|
||||
|
||||
var fileName = "appsettings.json";
|
||||
|
||||
string path = Path.Combine(Directory.GetCurrentDirectory(), fileName);
|
||||
|
||||
Assert.True(File.Exists(path));
|
||||
|
||||
var stream = File.OpenRead(path);
|
||||
|
||||
var result = await service!.UploadFileAsync(fileName, stream, MimeKit.MimeTypes.GetMimeType(fileName));
|
||||
|
||||
Assert.True(result.IsSuccess);
|
||||
Assert.NotNull(result.Value);
|
||||
Assert.NotEmpty(result.Value);
|
||||
|
||||
output.WriteLine(result.Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BookshopS3Service_MustDeleteFile()
|
||||
{
|
||||
var service = fixture.Services.GetKeyedService<IS3Service>(S3.Constants.BookshopBucketName);
|
||||
|
||||
var fileName = "appsettings.json";
|
||||
|
||||
string path = Path.Combine(Directory.GetCurrentDirectory(), fileName);
|
||||
|
||||
Assert.True(File.Exists(path));
|
||||
|
||||
var stream = File.OpenRead(path);
|
||||
|
||||
var uploadResult = await service!.UploadFileAsync(fileName, stream, MimeKit.MimeTypes.GetMimeType(fileName));
|
||||
|
||||
Assert.True(uploadResult.IsSuccess);
|
||||
Assert.NotNull(uploadResult.Value);
|
||||
Assert.NotEmpty(uploadResult.Value);
|
||||
|
||||
var fileKey = uploadResult.Value.Split('/').Last();
|
||||
|
||||
var deleteResult = await service!.DeleteFileAsync(fileKey);
|
||||
|
||||
Assert.True(deleteResult.IsSuccess);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
### Authentik Token Request (Service Account Explicit)
|
||||
POST {{authority}}/connect/token
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Accept-Encoding: identity
|
||||
|
||||
grant_type={{grantType}}&client_id={{clientId}}&client_secret={{clientSecret}}&scope={{scope}}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"uat": {
|
||||
"authority": "https://sts.security.khongisa.co.za",
|
||||
"grantType": "client_credentials",
|
||||
"clientId": "midrandbooks-api-scaler-uat",
|
||||
"clientSecret": "secret_0a8dc1f99061590a52b1272db3a1871d2761c79fbd058b2a968911029e4b208a",
|
||||
"scope": "midrandbooks-api"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
## Payfast Payment Confirmation
|
||||
# This endpoint is used by Payfast to confirm the payment status of a transaction.
|
||||
# It receives a POST request with the payment details and updates the order status accordingly.
|
||||
|
||||
POST {{baseUrl}}/v1/payments/payfast/confirm
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
amount={{amount}}&item_name={{item_name}}&m_payment_id={{paymentId}}&signature={{signature}}
|
||||
Reference in New Issue
Block a user