# Automated Testing Interface (Inter USS)

# Remote ID Test Data Injection (v0.5.1)

Esta interface é fornecida por cada Provedor de Serviço (Service Provider) que deseja ser testado pelo framework de testes automatizados. A suíte de testes chama esta interface para injetar dados de voo no sistema sob teste.

## Segurança (Autenticação)

- **Tipo:** OAuth2 (Client Credentials)
- **Escopo Necessário:** rid.inject\_test\_data
- **Descrição:** Acesso concedido para injetar dados de teste em um Provedor de Serviços.

## Endpoints

### 1. Criar Teste

**Rota:** `PUT /tests/{test_id}`

Solicita a criação de um ou mais voos lógicos baseados na injeção dos dados fornecidos. O ID de injeção (injection\_id) não pode ser modificado pelo provedor.

- **Parâmetros de Rota:** test\_id (obrigatório) - O ID do teste. Exemplo: 2979bd18-7f06-441c-bda6-e82c841c35d6
- **Corpo da Requisição:** Requer o objeto CreateTestParameters (uma lista de voos).
- **Respostas Esperadas:**
    
    
    - **200 OK:** Teste criado com sucesso. Retorna ChangeTestResponse.
    - **409 Conflict:** O teste já existe.

### 2. Deletar Teste

**Rota:** `DELETE /tests/{test_id}/{version}`

Remove todos os dados de teste associados a este teste do injetor do Provedor de Serviços.

- **Parâmetros de Rota:** test\_id (obrigatório) e version (obrigatório).
- **Respostas Esperadas:**
    
    
    - **200 OK:** Teste deletado com sucesso. Retorna DeleteTestResponse.

### 3. Consultar Notificações de Usuário

**Rota:** `GET /user_notifications`

Retorna a lista de notificações observadas pelo usuário virtual. As notificações devem estar disponíveis em até 5 segundos após a observação.

- **Parâmetros de Query:** \* after (obrigatório): Não incluir notificações observadas antes deste horário.
    
    
    - before (opcional): Não incluir notificações após este horário. O padrão é o agora.
- **Respostas Esperadas:**
    
    
    - **200 OK:** Notificações recuperadas com sucesso.
    - **400 Bad Request:** Faltando o parâmetro 'after' ou requisição inválida.
    - **401 Unauthorized:** Token ausente, não pôde ser decodificado ou é inválido.
    - **403 Forbidden:** Token decodificado, mas sem o escopo apropriado.

## Payload de Exemplo (JSON)

Formato esperado para o envio das informações do voo:

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-46 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQkwI" decode-data-ved="1" id="bkmrk-json" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_7db9aac8f6778303","c_c96b9eb05b5ddc8a",null,"rc_d19e9c6761b9397d",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-46"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-46"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-46 ng-star-inserted"><span class="ng-tns-c2141869219-46">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-46 ng-star-inserted"><button aria-label="Baixar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar o código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
{
  "requested_flights": [
    {
      "injection_id": "edb7695f-8737-4b9f-91f8-e2afbb333f41",
      "aircraft_type": "Aeroplane",
      "telemetry": [
        {
          "timestamp": "2024-04-22T16:36:50.52Z",
          "position": {
            "lat": -23.1791,
            "lng": -45.8872,
            "alt": 100.0
          }
        }
      ],
      "details_responses": [
        {
          "effective_after": "2024-04-22T16:36:50.52Z",
          "details": {
            "id": "a3423b-213401-0023"
          }
        }
      ]
    }
  ]
}
```

# Remote ID Display Data Observation (v0.3.0)

Esta interface é fornecida por cada Provedor de Exibição (Display Provider) que deseja ser testado pelo framework de testes automatizados. A suíte de testes chama esta interface para obter as informações atuais do Remote ID sob a perspectiva de um usuário do Provedor de Exibição.

## Segurança (Autenticação)

- **Tipo:** OAuth2 (Client Credentials)
- **Escopo Necessário:** dss.read.identification\_service\_areas
- **Descrição:** Acesso concedido para ler informações atuais do Remote ID. O token JWT deve ser enviado no header `Authorization: Bearer <token>`.

## Endpoints

### 1. Consultar Dados de Exibição (Poll Display Data)

**Rota:** `GET /display_data`

Solicita os dados atuais de exibição do Remote ID da mesma forma que seriam visualizados por uma Aplicação de Exibição (Display Application).

- **Parâmetros de Query:** \* view (obrigatório): A área desta visualização no formato lat1,lng1,lat2,lng2. A visualização é a menor caixa delimitada (bounding box) pelos pontos de canto fornecidos. Exemplo: 29.97816,31.13296,29.98025,31.13535
- **Respostas Esperadas:**
    
    
    - **200 OK:** Dados de exibição do Remote ID recuperados com sucesso. Retorna o schema GetDisplayDataResponse (contendo listas de voos e clusters).

### 2. Obter Detalhes do Voo

**Rota:** `GET /display_data/{id}`

Obtém os detalhes de um voo específico que foi previamente identificado através da rota `/display_data`.

- **Parâmetros de Rota:** \* id (obrigatório): O identificador do voo. Exemplo: 1e3adb99-acc9-424f-a04e-a0743538849a
- **Respostas Esperadas:**
    
    
    - **200 OK:** Detalhes sobre o voo solicitado foram recuperados com sucesso. Retorna o schema GetDetailsResponse.
    - **404 Not Found:** O voo solicitado não foi encontrado.

## Payloads de Exemplo (JSON)

### Exemplo de Resposta para `/display_data`

Formato esperado retornando voos conhecidos e aglomerados (clusters) onde a posição precisa não é exata:

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-80 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQwQQ" decode-data-ved="1" id="bkmrk-json" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_6184fd1e7f5193f1","c_c96b9eb05b5ddc8a",null,"rc_777611a3a08aabdf",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-80"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-80"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-80 ng-star-inserted"><span class="ng-tns-c2141869219-80">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-80 ng-star-inserted"><button aria-label="Baixar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar o código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
{
  "flights": [
    {
      "id": "1e3adb99-acc9-424f-a04e-a0743538849a",
      "aircraft_type": "Aeroplane",
      "current_state": {
        "timestamp": "2024-04-22T16:36:50.52Z",
        "operational_status": "Airborne"
      },
      "most_recent_position": {
        "lat": -23.1791,
        "lng": -45.8872,
        "alt": 100.0
      }
    }
  ],
  "clusters": [
    {
      "corners": [
        { "lat": -23.179, "lng": -45.887 },
        { "lat": -23.180, "lng": -45.888 }
      ],
      "area_sqm": 15000.5,
      "number_of_flights": 3
    }
  ]
}

```

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-80 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQwQQ" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_6184fd1e7f5193f1","c_c96b9eb05b5ddc8a",null,"rc_777611a3a08aabdf",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-80"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-80"></div></div></div>### Exemplo de Resposta para `/display_data/{id}`

Formato esperado retornando os detalhes do operador e da aeronave:

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-81 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQwgQ" decode-data-ved="1" id="bkmrk-json-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_6184fd1e7f5193f1","c_c96b9eb05b5ddc8a",null,"rc_777611a3a08aabdf",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-81"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-81"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-81 ng-star-inserted"><span class="ng-tns-c2141869219-81">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-81 ng-star-inserted"><button aria-label="Baixar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar o código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
{
  "operator": {
    "id": "OP-BR-987654321",
    "location": {
      "lat": -23.1805,
      "lng": -45.8881
    },
    "altitude": {
      "altitude": 550.0,
      "altitude_type": "Takeoff"
    }
  },
  "uas": {
    "id": "UAS-XT-550",
    "eu_classification": "Class0"
  }
}
```

# Flight Planning Automated Testing Interface (v0.7.0)

Esta interface é fornecida por um USS (UAS Service Supplier) que deseja participar de testes automatizados envolvendo tentativas de planejamento de voo. Um cliente (geralmente o `uss_qualifier`) instrui um usuário virtual a interagir com a interface do USS para planejar, atualizar e fechar planos de voo.

## Segurança (Autenticação)

- **Tipo:** OAuth2 (Client Credentials)
- **Escopos Necessários:**
    
    
    - `interuss.flight_planning.direct_automated_test`: Permite determinar a prontidão do USS para o teste e instruir o administrador a preparar a área de testes.
    - `interuss.flight_planning.plan`: Permite enviar instruções ao usuário virtual para planejar, modificar ou fechar um plano de voo.
- **Descrição:** O token JWT deve ser enviado no header `Authorization: Bearer <token>`.

## Endpoints

### 1. Consultar Status da Interface

**Rota:** `GET /status`

Obtém o status atual desta interface de testes automatizados.

- **Escopo Exigido:** `interuss.flight_planning.direct_automated_test`
- **Respostas Esperadas:**
    
    
    - **200 OK:** Interface disponível. Retorna se está `Starting` ou `Ready`.
    - **404 Not Found:** A interface de testes não está disponível.

### 2. Limpar Área (Clear Area)

**Rota:** `POST /clear_area_requests`

Solicita que o administrador do USS cancele e remova todos os planos de voo gerenciados por ele que interceptem a área especificada no payload.

- **Escopo Exigido:** `interuss.flight_planning.direct_automated_test`
- **Corpo da Requisição:** Requer `request_id` único e a extensão da área (`extent`).
- **Respostas Esperadas:**
    
    
    - **200 OK:** Área limpa com sucesso. Retorna `ClearAreaResponse` (indicando sucesso ou detalhes de falha na limpeza).

### 3. Criar ou Atualizar Plano de Voo (Upsert)

**Rota:** `PUT /flight_plans/{flight_plan_id}`

Simula a intenção de um usuário de enviar um plano de voo novo ou atualizado.

- **Escopo Exigido:** `interuss.flight_planning.plan`
- **Parâmetros de Rota:** `flight_plan_id` (obrigatório) - UUID formato v4. Ex: `03e5572a-f733-49af-bc14-8a18bd53ee39`
- **Corpo da Requisição:** Requer o objeto `UpsertFlightPlanRequest`.
- **Respostas Esperadas:**
    
    
    - **200 OK:** Dados processados com sucesso. Retorna `UpsertFlightPlanResponse` com o status do planejamento (`Completed`, `Rejected`, `Failed`, etc).
    - **409 Conflict:** Conflito de `request_id` duplicado ou outra condição de conflito.

### 4. Fechar/Deletar Plano de Voo

**Rota:** `DELETE /flight_plans/{flight_plan_id}`

Permite que o diretor de testes instrua o USS a remover um plano de voo que não é mais necessário para os testes.

- **Escopo Exigido:** `interuss.flight_planning.direct_automated_test`
- **Parâmetros de Rota:** `flight_plan_id` (obrigatório).
- **Respostas Esperadas:**
    
    
    - **200 OK:** Plano de voo deletado com sucesso. Retorna `DeleteFlightPlanResponse`.
    - **404 Not Found:** Plano de voo não encontrado (já pode ter sido deletado).

### 5. Consultar Notificações de Usuário

**Rota:** `GET /user_notifications`

Retorna a lista de notificações observadas pelo usuário virtual. Devem estar disponíveis para consulta em até 5 segundos após a observação.

- **Escopo Exigido:** `interuss.flight_planning.plan`
- **Parâmetros de Query:** \* `after` (obrigatório): Limite inferior de tempo.
    
    
    - `before` (opcional): Limite superior de tempo (padrão é o momento atual).
- **Respostas Esperadas:**
    
    
    - **200 OK:** Notificações recuperadas.
    - **400 Bad Request:** Parâmetros de tempo ausentes ou inválidos.

## Payload de Exemplo (JSON)

Formato simplificado esperado para a criação/atualização de um plano de voo (`PUT /flight_plans/{flight_plan_id}`):

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-71 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQpwQ" decode-data-ved="1" id="bkmrk-json" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_5240a7bcde9addbc","c_c96b9eb05b5ddc8a",null,"rc_2ba1c3b0e3e849bf",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-71"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-71"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-71 ng-star-inserted"><span class="ng-tns-c2141869219-71">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-71 ng-star-inserted"><button aria-label="Baixar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar o código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
{
  "request_id": "b5a9b837-1234-4a2b-9876-c5096a295a12",
  "execution_style": "IfAllowed",
  "flight_plan": {
    "basic_information": {
      "usage_state": "Planned",
      "description": "Medical supplies delivery operated by Example Drone Company",
      "utm_id": "ae1fa066-6d68-4018-8274-af867966978e",
      "area": [
        {
          "volume": {
            "outline_polygon": {
              "vertices": [
                { "lat": -23.179, "lng": -45.887 },
                { "lat": -23.180, "lng": -45.888 }
              ]
            },
            "altitude_lower": { "value": 0, "reference": "W84", "units": "M" },
            "altitude_upper": { "value": 120, "reference": "W84", "units": "M" }
          },
          "time_start": { "value": "2024-04-22T16:30:00Z", "format": "RFC3339" },
          "time_end": { "value": "2024-04-22T17:30:00Z", "format": "RFC3339" }
        }
      ]
    }
  }
}
```

# Versioning Automated Testing Interface (v0.1.2)

Esta interface é fornecida por um USS (UAS Service Supplier) que deseja fornecer informações sobre a(s) versão(ões) do seu software para destinatários autorizados de maneira automatizada.

## Segurança (Autenticação)

- **Tipo:** OAuth2 (Client Credentials)
- **Escopo Necessário:** `interuss.versioning.read_system_versions`
- **Descrição:** Permite que o cliente leia a(s) versão(ões) do software do USS implantado neste ambiente. O token JWT deve ser enviado no header `Authorization: Bearer <token>`.

## Endpoints

### 1. Consultar Versão do Sistema (System Version)

**Rota:** `GET /versions/{system_identity}`

Obtém a versão do sistema solicitado com base em seu identificador de limite (system boundary).

- **Parâmetros de Rota:** `system_identity` (obrigatório) - Um identificador de limite de sistema conhecido tanto pelo cliente quanto pelo USS. O valor deve ser URL-safe (geralmente estruturado em ordem reversa de domínio, similar a pacotes Java). Exemplo: `gov.eu.uspace.v1.netid` ou `gov.au.casa.operating_rules.v2_6`.
- **Respostas Esperadas:**
    
    
    - **200 OK:** A interface forneceu com sucesso a versão do sistema/limite solicitado. Retorna o schema `GetVersionResponse`.
    - **401 Unauthorized:** Token ausente, não decodificado ou inválido.
    - **403 Forbidden:** O token foi decodificado com sucesso, mas não inclui o escopo apropriado para este endpoint.
    - **404 Not Found:** A identidade/limite do sistema solicitada não é conhecida, ou a interface de automação de versão não está disponível.

## Payload de Exemplo (JSON)

### Exemplo de Resposta de Versão (`GET /versions/{system_identity}`)

Formato esperado retornando a identidade do sistema solicitado e sua versão atual (preferencialmente utilizando controle de versão semântico).

<div _ngcontent-ng-c693768606="" class="code-block ng-tns-c693768606-113 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiRnIvfm52VAxUAAAAAHQAAAAAQqwY" decode-data-ved="1" id="bkmrk-json" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_b0b9765cc592b208","c_c96b9eb05b5ddc8a",null,"rc_9061d0fb57a1f801",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c693768606="" class="formatted-code-block-internal-container ng-tns-c693768606-113"><div _ngcontent-ng-c693768606="" class="animated-opacity ng-tns-c693768606-113"><div _ngcontent-ng-c693768606="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c693768606-113 ng-star-inserted"><span class="ng-tns-c693768606-113">JSON</span><div _ngcontent-ng-c693768606="" class="buttons ng-tns-c693768606-113 ng-star-inserted"><button aria-label="Baixar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar o código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
{
  "system_identity": "gov.au.casa.operating_rules.v2_6",
  "system_version": "v2.19.53117-rc8+d3a7521f"
}
```