Skip to content

Commit 69e6eb4

Browse files
committed
Add unit tests for AdminResourceRepository and AdminResourceService
1 parent 717e415 commit 69e6eb4

File tree

2 files changed

+161
-4
lines changed

2 files changed

+161
-4
lines changed

test/AzureOpenAIProxy.ApiApp.Tests/Repositories/AdminResourceRepositoryTests.cs

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using Azure;
21
using Azure.Data.Tables;
32

43
using AzureOpenAIProxy.ApiApp.Configurations;
@@ -10,10 +9,85 @@
109
using Microsoft.Extensions.DependencyInjection;
1110

1211
using NSubstitute;
13-
using NSubstitute.ExceptionExtensions;
1412

1513
namespace AzureOpenAIProxy.ApiApp.Tests.Repositories;
1614

1715
public class AdminResourceRepositoryTests
1816
{
17+
[Fact]
18+
public void Given_ServiceCollection_When_AddAdminResourceRepository_Invoked_Then_It_Should_Contain_AdminResourceRepository()
19+
{
20+
// Arrange
21+
var services = new ServiceCollection();
22+
23+
// Act
24+
services.AddAdminResourceRepository();
25+
26+
// Assert
27+
services.SingleOrDefault(p => p.ServiceType == typeof(IAdminResourceRepository)).Should().NotBeNull();
28+
}
29+
30+
[Fact]
31+
public void Given_Null_TableServiceClient_When_Creating_AdminResourceRepository_Then_It_Should_Throw_Exception()
32+
{
33+
// Arrange
34+
var settings = Substitute.For<StorageAccountSettings>();
35+
var tableServiceClient = default(TableServiceClient);
36+
37+
// Act
38+
Action action = () => new AdminResourceRepository(tableServiceClient!, settings);
39+
40+
// Assert
41+
action.Should().Throw<ArgumentNullException>();
42+
}
43+
44+
[Fact]
45+
public void Given_Null_StorageAccountSettings_When_Creating_AdminResourceRepository_Then_It_Should_Throw_Exception()
46+
{
47+
// Arrange
48+
var settings = default(StorageAccountSettings);
49+
var tableServiceClient = Substitute.For<TableServiceClient>();
50+
51+
// Act
52+
Action action = () => new AdminResourceRepository(tableServiceClient, settings!);
53+
54+
// Assert
55+
action.Should().Throw<ArgumentNullException>();
56+
}
57+
58+
[Fact]
59+
public async Task Given_Instance_When_CreateResource_Invoked_Then_It_Should_Add_Entity()
60+
{
61+
// Arrange
62+
var settings = Substitute.For<StorageAccountSettings>();
63+
var tableServiceClient = Substitute.For<TableServiceClient>();
64+
var tableClient = Substitute.For<TableClient>();
65+
tableServiceClient.GetTableClient(Arg.Any<string>()).Returns(tableClient);
66+
67+
var repository = new AdminResourceRepository(tableServiceClient, settings);
68+
69+
var resourceId = Guid.NewGuid();
70+
var resourceDetails = new AdminResourceDetails
71+
{
72+
ResourceId = resourceId,
73+
FriendlyName = "Test Resource",
74+
DeploymentName = "Test Deployment",
75+
ResourceType = ResourceType.Chat,
76+
Endpoint = "https://test.endpoint.com",
77+
ApiKey = "test-api-key",
78+
Region = "test-region",
79+
IsActive = true,
80+
PartitionKey = PartitionKeys.ResourceDetails,
81+
RowKey = resourceId.ToString()
82+
};
83+
84+
// Act
85+
var result = await repository.CreateResource(resourceDetails);
86+
87+
// Assert
88+
await tableClient.Received(1).AddEntityAsync(Arg.Is<AdminResourceDetails>(x =>
89+
x.ResourceId == resourceDetails.ResourceId
90+
));
91+
result.Should().BeEquivalentTo(resourceDetails);
92+
}
1993
}

test/AzureOpenAIProxy.ApiApp.Tests/Services/AdminResourceServiceTests.cs

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
using Azure;
2-
31
using AzureOpenAIProxy.ApiApp.Models;
42
using AzureOpenAIProxy.ApiApp.Repositories;
53
using AzureOpenAIProxy.ApiApp.Services;
@@ -15,4 +13,89 @@ namespace AzureOpenAIProxy.ApiApp.Tests.Services;
1513

1614
public class AdminResourceServiceTests
1715
{
16+
[Fact]
17+
public void Given_ServiceCollection_When_AddAdminResourceService_Invoked_Then_It_Should_Contain_AdminResourceService()
18+
{
19+
// Arrange
20+
var services = new ServiceCollection();
21+
22+
// Act
23+
services.AddAdminResourceService();
24+
25+
// Assert
26+
services.SingleOrDefault(p => p.ServiceType == typeof(IAdminResourceService)).Should().NotBeNull();
27+
}
28+
29+
[Fact]
30+
public void Given_Null_Repository_When_Creating_AdminResourceService_Then_It_Should_Throw_Exception()
31+
{
32+
// Arrange
33+
IAdminResourceRepository? repository = null;
34+
35+
// Act
36+
Action action = () => new AdminResourceService(repository!);
37+
38+
// Assert
39+
action.Should().Throw<ArgumentNullException>();
40+
}
41+
42+
[Fact]
43+
public async Task Given_Instance_When_CreateResource_Invoked_Then_It_Should_Add_Entity()
44+
{
45+
// Arrange
46+
var repository = Substitute.For<IAdminResourceRepository>();
47+
var service = new AdminResourceService(repository);
48+
49+
var resourceDetails = new AdminResourceDetails
50+
{
51+
ResourceId = Guid.NewGuid(),
52+
FriendlyName = "Test Resource",
53+
DeploymentName = "Test Deployment",
54+
ResourceType = ResourceType.Chat,
55+
Endpoint = "https://test.endpoint.com",
56+
ApiKey = "test-api-key",
57+
Region = "test-region",
58+
IsActive = true
59+
};
60+
61+
repository.CreateResource(resourceDetails).Returns(resourceDetails);
62+
63+
// Act
64+
var result = await service.CreateResource(resourceDetails);
65+
66+
// Assert
67+
await repository.Received(1).CreateResource(Arg.Is<AdminResourceDetails>(x =>
68+
x.ResourceId == resourceDetails.ResourceId
69+
));
70+
71+
result.Should().BeEquivalentTo(resourceDetails);
72+
}
73+
74+
[Fact]
75+
public async Task Given_RepositoryFails_When_CreateResource_Invoked_Then_It_Should_Throw_Exception()
76+
{
77+
// Arrange
78+
var repository = Substitute.For<IAdminResourceRepository>();
79+
var service = new AdminResourceService(repository);
80+
81+
var resourceDetails = new AdminResourceDetails
82+
{
83+
ResourceId = Guid.NewGuid(),
84+
FriendlyName = "Test Resource",
85+
DeploymentName = "Test Deployment",
86+
ResourceType = ResourceType.Chat,
87+
Endpoint = "https://test.endpoint.com",
88+
ApiKey = "test-api-key",
89+
Region = "test-region",
90+
IsActive = true
91+
};
92+
93+
repository.CreateResource(Arg.Any<AdminResourceDetails>()).ThrowsAsync(new InvalidOperationException());
94+
95+
// Act
96+
Func<Task> act = async () => await service.CreateResource(resourceDetails);
97+
98+
// Assert
99+
await act.Should().ThrowAsync<InvalidOperationException>();
100+
}
18101
}

0 commit comments

Comments
 (0)