# La Comisión Consultiva recomienda que el Secretario General apruebe el siguiente proyecto de resolución:

# El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

En el párrafo 2 de la resolución, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación del Programa de Acción. [La Comisión Consultiva recomienda que el Secretario General apruebe el siguiente proyecto de resolución:](https://www.nuget.org/packages/Umami.Net/) por supuesto quiero asegurar que todo funciona como se espera. Para hacer esto la mejor manera es probar de alguna forma exhaustiva todas las metodologías y clases. Aquí viene el test de unidadM SK2
Nota: Esta no es una ' un ' enfoque perfectoM SK3 post tipoMSC4 es la misma ' como yo lo he hecho en el momento actualMST7 En realidad, no tengo que mocar a `IHttpMessageHandler` aquí se puede atacar un DelegatingMessageHandler a un cliente Http normal para hacer esto. quería mostrar solo cómo se puede hacer con Mock.

[TOC]

<!--category-- xUnit, Umami -->
<datetime class="hidden">2024-09-01T17:22</datetime>

# El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.

La prueba de unidad se refiere al proceso de prueba de unidades individuales de código para asegurar que funcionen como se esperaba. Esto se hace mediante escribir pruebas que llaman los métodos y las clases de una manera controlada y luego comprobar la salida es como se esperara.

Para un paquete como Umami.Net esto es algo complicado ya que ambos llaman a un cliente remoto. `HttpClient` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `IHostedService` utiliza para hacer que el envío de nuevos datos de evento sea tan transparente como sea posible.

## El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de disposiciones legislativas, administrativas y de otra índole que prohíban la discriminación.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `HttpClient` base de biblioteca es evitar la llamada real 'HttpClient' callM SK2 Esto se hace creando un `HttpClient` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `HttpMessageHandler` . Esto se hace mediante la creación de un `HttpClient` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `HttpMessageHandler` que reembolsa una respuesta conocida; en este caso sólo echo de nuevo la respuesta de entrada y comprobar que' no ha sido manipulado por el `UmamiClient`.

```csharp
    public static HttpMessageHandler Create()
    {
        var mockHandler = new Mock<HttpMessageHandler>();

        mockHandler.Protected()
            .Setup<Task<HttpResponseMessage>>(
                "SendAsync",
                ItExpr.Is<HttpRequestMessage>(x => x.RequestUri.ToString().Contains("api/send")),
                ItExpr.IsAny<CancellationToken>())
            .ReturnsAsync((HttpRequestMessage request, CancellationToken cancellationToken) =>
            {
                // Read the request content
                var requestBody = request.Content != null
                    ? request.Content.ReadAsStringAsync(cancellationToken).Result
                    : null;

                // Create a response that echoes the request body
                var responseContent = requestBody != null
                    ? requestBody
                    : "No request body";


                // Return the response
                return new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(responseContent, Encoding.UTF8, "application/json")
                };
            });

        return mockHandler.Object;
    }
```

Como usted verá' esto configura un `Mock<HttpMessageHandler>` En el párrafo 2 de la resolución, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación del Programa de Acción para prevenir, combatir y eliminar el tráfico ilícito de armas pequeñas y ligeras en todos sus aspectos. `UmamiClient`.
En este código añado esto a nuestro `IServiceCollection` method. Esto agrega todos los servicios necesarios por el `UmamiClient` Además, el Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. `HttpMessageHandler` El Comité recomienda al Estado Parte que incluya en su próximo informe periódico información detallada sobre la situación de los derechos humanos y las libertades fundamentales de todos los trabajadores migratorios y de sus familiares. `IServiceCollection` Para uso en las pruebas.

```csharp
    public static IServiceCollection SetupServiceCollection(string webSiteId = Consts.WebSiteId,
        string umamiPath = Consts.UmamiPath, HttpMessageHandler? handler = null)
    {
        var services = new ServiceCollection();
        var umamiClientSettings = new UmamiClientSettings
        {
            WebsiteId = webSiteId,
            UmamiPath = umamiPath
        };
        services.AddSingleton(umamiClientSettings);
        services.AddScoped<PayloadService>();
        services.AddLogging(x => x.AddConsole());
        // Mocking HttpMessageHandler with Moq
        var mockHandler = handler ?? EchoMockHandler.Create();
        services.AddHttpClient<UmamiClient>((serviceProvider, client) =>
        {
            var umamiSettings = serviceProvider.GetRequiredService<UmamiClientSettings>();
            client.BaseAddress = new Uri(umamiSettings.UmamiPath);
        }).ConfigurePrimaryHttpMessageHandler(() => mockHandler);
        return services;
    }
```

Para usarlo y inyectarlo en el `UmamiClient` Después utilizo estos servicios en el `UmamiClient` El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole.

```csharp
    public static UmamiClient GetUmamiClient(IServiceCollection? serviceCollection = null,
        HttpContextAccessor? contextAccessor = null)
    {
        serviceCollection ??= SetupServiceCollection();
        SetupUmamiClient(serviceCollection, contextAccessor);
        if (serviceCollection == null) throw new NullReferenceException(nameof(serviceCollection));
        var serviceProvider = serviceCollection.BuildServiceProvider();
        return serviceProvider.GetRequiredService<UmamiClient>();
    }
```

Usted'verás que tengo una serie de parámetros opcionales alternativos aquí que me permiten introducir diferentes opciones para diferentes tipos de prueba.

### El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Así que ahora tengo toda esta configuración en lugar puedo ahora empezar a escribir pruebas para el `UmamiClient` El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole.

#### El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos desglosados por sexo, edad y origen étnico.

Lo que toda esta configuración significa es que nuestras pruebas pueden ser realmente bastante sencillas

```csharp
public class UmamiClient_SendTests
{
    [Fact]
    public async Task Send_Wrong_Type()
    {
        var umamiClient = SetupExtensions.GetUmamiClient();
        await Assert.ThrowsAsync<ArgumentException>(async () => await umamiClient.Send(type: "boop"));
    }

    [Fact]
    public async Task Send_Empty_Success()
    {
        var umamiClient = SetupExtensions.GetUmamiClient();
        var response = await umamiClient.Send();
        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
    }
}
```

Aquí se ve el caso de prueba más sencillo, garantizando que la `UmamiClient` puede enviar un mensaje y obtener una respuesta; importantemente también testamos para un caso de excepción donde el `type` es incorrecto. Esta es una parte de la prueba que a menudo se ignora, para asegurarse de que el código fracasa como se esperabaM SK2

#### El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Para probar nuestro método de visualización de página podemos hacer algo parecido. En el código de abajo uso mi `EchoHttpHandler` para reflejar la respuesta enviada y asegurarse de que envía lo que espero.

```csharp
    [Fact]
    public async Task TrackPageView_WithNoUrl()
    {
        var defaultUrl = "/testpath";
        var contextAccessor = SetupExtensions.SetupHttpContextAccessor(path: "/testpath");
        var umamiClient = SetupExtensions.GetUmamiClient(contextAccessor: contextAccessor);
        var response = await umamiClient.TrackPageView();

        var content = await response.Content.ReadFromJsonAsync<EchoedRequest>();
        Assert.NotNull(response);
        Assert.NotNull(content);
        Assert.Equal(content.Payload.Url, defaultUrl);
        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
    }
```

### En la misma sesión, el Consejo aprobó el proyecto de resolución A/C.2/57/L.32 sin someterlo a votación (véase párr.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `HttpContextAccessor` El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. `/testpath` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `UmamiClient` El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.

```csharp
    public static HttpContextAccessor SetupHttpContextAccessor(string host = Consts.Host,
        string path = Consts.Path, string ip = Consts.Ip, string userAgent = Consts.UserAgent,
        string referer = Consts.Referer)
    {
        HttpContext httpContext = new DefaultHttpContext();
        httpContext.Request.Host = new HostString(host);
        httpContext.Request.Path = new PathString(path);
        httpContext.Connection.RemoteIpAddress = IPAddress.Parse(ip);
        httpContext.Request.Headers.UserAgent = userAgent;
        httpContext.Request.Headers.Referer = referer;

        var context = new HttpContextAccessor { HttpContext = httpContext };
        return context;
    }

```

Esto es importante para nuestro código cliente Umami, ya que la mayoría de los datos enviados de cada solicitud son generados de forma dinámica desde el `HttpContext` Object. Así que no podemos enviar nada en un `await umamiClient.TrackPageView();` y todavía enviará los datos correctos extrayendo el Url de la `HttpContext`.

Como veremos más adelante, también es importante que el esplendor envíe artículos como el `UserAgent` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `IPAddress` Como estas son utilizadas por el servidor Umami para rastrear los datos y 'trackM SK1 opiniones de usuario sin usar cookies.

Para tener este predecible definimos un grupo de Consts en el `Consts` class. Así que podemos probar contra respuestas predecibles y peticionesM SK1

```csharp
public class Consts
{
    public const string UmamiPath = "https://example.com";
    public const string WebSiteId = "B41A9964-FD33-4108-B6EC-9A6B68150763";
    public const string Host = "example.com";
    public const string Path = "/example";
    public const string Ip = "127.0.0.1";
    public const string UserAgent = "Test User Agent";
    public const string Referer = "Test Referer";
    public const string DefaultUrl = "/testpath";
    public const string DefaultTitle = "Example Page";
    public const string DefaultName = "RSS";
    public const string DefaultType = "event";

    public const string Email = "test@test.com";

    public const string UserId = "11224456";
    
    public const string UserName = "Test User";
    
    public const string SessionId = "B41A9964-FD33-4108-B6EC-9A6B68150763";
}
```

## El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole.

Este es sólo el comienzo de nuestra estrategia de pruebas para Umami.Net, todavía tenemos que probar `IHostedService` y prueba contra los datos reales Umami genera (que no está documentado en ningún lugar pero contiene un token JWT con algunos datos útiles.)

```json
{
  "alg": "HS256",
  "typ": "JWT"
}{
  "id": "b9836672-feee-55c5-985a-a5a23d4a23ad",
  "websiteId": "32c2aa31-b1ac-44c0-b8f3-ff1f50403bee",
  "hostname": "example.com",
  "browser": "chrome",
  "os": "Windows 10",
  "device": "desktop",
  "screen": "1920x1080",
  "language": "en-US",
  "country": "GB",
  "subdivision1": null,
  "subdivision2": null,
  "city": null,
  "createdAt": "2024-09-01T09:26:14.418Z",
  "visitId": "e7a6542f-671a-5573-ab32-45244474da47",
  "iat": 1725182817
}2|Y*: �(N%-ޘ^1>@V
```

Así que nosotros ' queremos probar para que , simular el token y posiblemente devolver los datos en cada visita. `uuid(websiteId,ipaddress, useragent)`).

# El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Este es sólo el comienzo de la prueba del paquete Umami.Net , hay mucho más que hacer, pero este es un buen comienzoM SK3 I' añadiré más pruebas a medida que vaya y sin duda mejoraré estas.