diff --git a/tests/ReC.Tests/Client/ProfileApiTests.cs b/tests/ReC.Tests/Client/ProfileApiTests.cs new file mode 100644 index 0000000..442795f --- /dev/null +++ b/tests/ReC.Tests/Client/ProfileApiTests.cs @@ -0,0 +1,118 @@ +using System.Net; +using System.Text.Json; +using Microsoft.Extensions.Configuration; +using ReC.Application.Common.Dto; +using ReC.Application.Common.Procedures.UpdateProcedure.Dto; +using ReC.Application.Profile.Commands; +using ReC.Client; + +namespace ReC.Tests.Client; + +[TestFixture] +public class ProfileApiTests : RecClientTestBase +{ + [Test] + public void ReCClient_profiles_api_is_resolvable_through_dependency_injection() + { + var (client, scope) = CreateScopedClient(); + using var _ = scope; + + Assert.That(client, Is.Not.Null); + Assert.That(client.Profiles, Is.Not.Null); + } + + [Test] + public void GetAsync_with_unknown_id_throws_not_found() + { + var (client, scope) = CreateScopedClient(); + using var _ = scope; + + var ex = Assert.ThrowsAsync(async () => + await client.Profiles.GetAsync(id: long.MaxValue)); + + Assert.That(ex, Is.Not.Null); + Assert.That(ex!.StatusCode, Is.EqualTo(HttpStatusCode.NotFound)); + Assert.That(ex.Method, Is.EqualTo("GET")); + } + + [Test] + public void GetDynamicAsync_with_unknown_id_throws_not_found() + { + var (client, scope) = CreateScopedClient(); + using var _ = scope; + + var ex = Assert.ThrowsAsync(async () => + await client.Profiles.GetDynamicAsync(id: long.MaxValue)); + + Assert.That(ex, Is.Not.Null); + Assert.That(ex!.StatusCode, Is.EqualTo(HttpStatusCode.NotFound)); + Assert.That(ex.Method, Is.EqualTo("GET")); + } + + [Test] + public async Task GetDynamicAsync_without_filters_returns_dynamic_payload_or_throws_not_found() + { + var (client, scope) = CreateScopedClient(); + using var _ = scope; + + try + { + dynamic profiles = await client.Profiles.GetDynamicAsync(); + Assert.That(profiles, Is.Not.Null); + Assert.That(profiles, Is.TypeOf()); + } + catch (ReCApiException ex) + { + Assert.That(ex.StatusCode, Is.EqualTo(HttpStatusCode.NotFound)); + Assert.That(ex.Method, Is.EqualTo("GET")); + } + } + + [Test] + public void UpdateAsync_with_unknown_id_throws_or_completes() + { + var (client, scope) = CreateScopedClient(); + using var _ = scope; + + var payload = new UpdateProfileDto + { + Active = false, + Name = "test-profile" + }; + + try + { + client.Profiles.UpdateAsync(long.MaxValue, payload).GetAwaiter().GetResult(); + Assert.Pass("Update completed."); + } + catch (ReCApiException ex) + { + Assert.That(ex.Method, Is.EqualTo("PUT")); + Assert.That(ex.RequestUri!.AbsolutePath, Does.EndWith($"api/Profile/{long.MaxValue}")); + } + } + + [Test] + public void DeleteAsync_sends_payload_as_query_string() + { + var (client, scope) = CreateScopedClient(); + using var _ = scope; + + var payload = new DeleteProfileCommand + { + Start = long.MaxValue - 1, + End = long.MaxValue, + Force = false + }; + + try + { + client.Profiles.DeleteAsync(payload).GetAwaiter().GetResult(); + } + catch (ReCApiException ex) + { + Assert.That(ex.Method, Is.EqualTo("DELETE")); + Assert.That(ex.RequestUri!.Query, Does.Contain("Start=").And.Contains("End=").And.Contains("Force=")); + } + } +}