diff --git a/Mimir.MongoDB/Repositories/BalanceRepository.cs b/Mimir.MongoDB/Repositories/BalanceRepository.cs index da2303a7..cb0ff279 100644 --- a/Mimir.MongoDB/Repositories/BalanceRepository.cs +++ b/Mimir.MongoDB/Repositories/BalanceRepository.cs @@ -1,13 +1,18 @@ using Libplanet.Crypto; using Libplanet.Types.Assets; -using Mimir.MongoDB.Exceptions; using Mimir.MongoDB.Bson; +using Mimir.MongoDB.Exceptions; using Mimir.MongoDB.Services; using MongoDB.Driver; namespace Mimir.MongoDB.Repositories; -public class BalanceRepository(IMongoDbService dbService) +public interface IBalanceRepository +{ + Task GetByAddressAsync(Currency currency, Address address); +} + +public class BalanceRepository(IMongoDbService dbService) : IBalanceRepository { public async Task GetByAddressAsync(Currency currency, Address address) { diff --git a/Mimir.Tests/QueryTests/BalanceQueryTest.GraphQL_Query_Balance_CRYSTAL_Returns_CorrectValue.verified.txt b/Mimir.Tests/QueryTests/BalanceQueryTest.GraphQL_Query_Balance_CRYSTAL_Returns_CorrectValue.verified.txt new file mode 100644 index 00000000..93f63e46 --- /dev/null +++ b/Mimir.Tests/QueryTests/BalanceQueryTest.GraphQL_Query_Balance_CRYSTAL_Returns_CorrectValue.verified.txt @@ -0,0 +1,5 @@ +{ + "data": { + "balance": "fgfgf" + } +} \ No newline at end of file diff --git a/Mimir.Tests/QueryTests/BalanceQueryTest.GraphQL_Query_Balance_NCG_Returns_CorrectValue.verified.txt b/Mimir.Tests/QueryTests/BalanceQueryTest.GraphQL_Query_Balance_NCG_Returns_CorrectValue.verified.txt new file mode 100644 index 00000000..93f63e46 --- /dev/null +++ b/Mimir.Tests/QueryTests/BalanceQueryTest.GraphQL_Query_Balance_NCG_Returns_CorrectValue.verified.txt @@ -0,0 +1,5 @@ +{ + "data": { + "balance": "fgfgf" + } +} \ No newline at end of file diff --git a/Mimir.Tests/QueryTests/BalanceQueryTest.GraphQL_Query_Balance_Throws_When_No_Inputs_Provided.verified.txt b/Mimir.Tests/QueryTests/BalanceQueryTest.GraphQL_Query_Balance_Throws_When_No_Inputs_Provided.verified.txt new file mode 100644 index 00000000..dac2b846 --- /dev/null +++ b/Mimir.Tests/QueryTests/BalanceQueryTest.GraphQL_Query_Balance_Throws_When_No_Inputs_Provided.verified.txt @@ -0,0 +1,17 @@ +{ + "errors": [ + { + "message": "Either currency or currencyTicker must be provided.", + "locations": [ + { + "line": 2, + "column": 7 + } + ], + "path": [ + "balance" + ] + } + ], + "data": null +} \ No newline at end of file diff --git a/Mimir.Tests/QueryTests/BalanceQueryTest.cs b/Mimir.Tests/QueryTests/BalanceQueryTest.cs new file mode 100644 index 00000000..0893901f --- /dev/null +++ b/Mimir.Tests/QueryTests/BalanceQueryTest.cs @@ -0,0 +1,80 @@ +using HotChocolate.AspNetCore; +using Lib9c.GraphQL.Extensions; +using Libplanet.Crypto; +using Mimir.MongoDB.Bson; +using Mimir.MongoDB.Repositories; +using Moq; + +namespace Mimir.Tests.QueryTests; + +public class BalanceQueryTest +{ + [Fact] + public async Task GraphQL_Query_Balance_CRYSTAL_Returns_CorrectValue() + { + var mockAddress = new Address("0x0000000000000000000000000000000000000000"); + var mockRepo = new Mock(); + + mockRepo + .Setup(repo => repo.GetByAddressAsync("CRYSTAL".ToCurrency(), mockAddress)) + .ReturnsAsync(new BalanceDocument(1, new Address(), "fgfgf")); + + var serviceProvider = TestServices.Builder + .With(mockRepo.Object) + .Build(); + + var query = $$""" + query { + balance(currencyTicker: "CRYSTAL", address: "{{mockAddress}}") + } + """; + + var result = await TestServices.ExecuteRequestAsync(serviceProvider, b => b.SetDocument(query)); + + await Verify(result); + } + + [Fact] + public async Task GraphQL_Query_Balance_NCG_Returns_CorrectValue() + { + var mockAddress = new Address("0x0000000000000000000000000000000000000000"); + var mockRepo = new Mock(); + + mockRepo + .Setup(repo => repo.GetByAddressAsync("NCG".ToCurrency(), mockAddress)) + .ReturnsAsync(new BalanceDocument(1, new Address(), "fgfgf")); + + var serviceProvider = TestServices.Builder + .With(mockRepo.Object) + .Build(); + + var query = $$""" + query { + balance(currencyTicker: "NCG", address: "{{mockAddress}}") + } + """; + + var result = await TestServices.ExecuteRequestAsync(serviceProvider, b => b.SetDocument(query)); + + await Verify(result); + } + + [Fact] + public async Task GraphQL_Query_Balance_Throws_When_No_Inputs_Provided() + { + var mockRepo = new Mock(); + + var serviceProvider = TestServices.Builder + .With(mockRepo.Object) + .Build(); + + var query = $$""" + query { + balance(address: "0x0000000000000000000000000000000000000000") + } + """; + + var result = await TestServices.ExecuteRequestAsync(serviceProvider, b => b.SetDocument(query)); + await Verify(result); + } +} \ No newline at end of file diff --git a/Mimir/GraphQL/Queries/Query.cs b/Mimir/GraphQL/Queries/Query.cs index 7b66e1b4..8e5bd933 100644 --- a/Mimir/GraphQL/Queries/Query.cs +++ b/Mimir/GraphQL/Queries/Query.cs @@ -60,7 +60,7 @@ public async Task GetBalanceAsync( CurrencyInput? currency, string? currencyTicker, Address address, - [Service] BalanceRepository repo) + [Service] IBalanceRepository repo) { if (currency is not null) { diff --git a/Mimir/Program.cs b/Mimir/Program.cs index e4d76128..ca4e6ec4 100644 --- a/Mimir/Program.cs +++ b/Mimir/Program.cs @@ -10,6 +10,7 @@ using Mimir.MongoDB.Repositories; using Mimir.Options; using Mimir.MongoDB.Services; +using BalanceRepository = Mimir.MongoDB.Repositories.BalanceRepository; var builder = WebApplication.CreateBuilder(args); @@ -42,7 +43,7 @@ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); -builder.Services.AddSingleton(); +builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton();