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 async Task UpdateAsync_with_unknown_id_throws_or_completes() { var (client, scope) = CreateScopedClient(); using var _ = scope; var payload = new UpdateProfileDto { Active = false, Name = "test-profile" }; try { await client.Profiles.UpdateAsync(long.MaxValue, payload); 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 async Task 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 { await client.Profiles.DeleteAsync(payload); } catch (ReCApiException ex) { Assert.That(ex.Method, Is.EqualTo("DELETE")); Assert.That(ex.RequestUri!.Query, Does.Contain("Start=").And.Contains("End=").And.Contains("Force=")); } } }