clickup_v2 0.1.0

A comprehensive Rust client library and CLI for ClickUp API v2 with OAuth2 authentication, task management, and custom fields support
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
# Estratégia de Testes - ClickUp v2 Rust Crate

## Visão Geral

Este documento descreve a estratégia completa de testes para o crate ClickUp v2, incluindo tipos de testes, ferramentas utilizadas, e como executá-los.

## Estrutura de Testes

### 1. Testes Unitários

Localizados dentro de cada módulo no diretório `src/`, testam funcionalidades isoladas.

- **Localização**: `src/**/*.rs` (dentro de `#[cfg(test)]` modules)
- **Cobertura**:
  - Módulo `config/env.rs`: Configuração e variáveis de ambiente
  - Módulo `auth/oauth.rs`: Fluxo OAuth2
  - Módulo `error/auth_error.rs`: Tratamento de erros
  - Módulo `client/api.rs`: Cliente HTTP

### 2. Testes de Integração

Localizados no diretório `tests/`, testam a interação entre módulos.

- **Localização**: `tests/`
- **Arquivos**:
  - `api_integration_tests.rs`: Testes de API completos
  - `oauth_integration_tests.rs`: Fluxo OAuth2 completo
  - `env_config_tests.rs`: Configuração de ambiente
  - `error_handling_tests.rs`: Cenários de erro

### 3. Mocks

Utilitários para simular respostas HTTP em testes.

- **Localização**: `tests/mocks/`
- **Propósito**: Simular respostas da API ClickUp sem fazer chamadas reais

### 4. Benchmarks

Testes de performance para identificar gargalos.

- **Localização**: `benches/`
- **Arquivo**: `api_benchmarks.rs`

## Ferramentas e Dependências

### Dependências de Teste (dev-dependencies)

```toml
[dev-dependencies]
tokio-test = "0.4"          # Framework de testes assíncronos
mockito = "1.2"             # Mock de servidor HTTP
wiremock = "0.6"            # Mock avançado de HTTP
pretty_assertions = "1.4"    # Assertions mais legíveis
claim = "0.5"               # Assertions adicionais
fake = "2.9"                # Geração de dados de teste
quickcheck = "1.0"          # Testes baseados em propriedades
insta = "1.34"              # Testes de snapshot
temp-env = "0.3"            # Manipulação de variáveis de ambiente em testes
criterion = "0.5"           # Framework de benchmark
```

## Como Executar os Testes

### Usando Cargo (Manual)

```bash
# Executar todos os testes
cargo test

# Executar apenas testes unitários
cargo test --lib

# Executar apenas testes de integração
cargo test --test '*'

# Executar testes com output verboso
cargo test --verbose

# Executar testes de um módulo específico
cargo test config::

# Executar um teste específico
cargo test test_oauth_flow_creation

# Executar testes em paralelo (padrão) ou sequencial
cargo test -- --test-threads=1

# Executar testes ignorados
cargo test -- --ignored
```

### Usando Make (Automatizado)

```bash
# Ver todos os comandos disponíveis
make help

# Executar todos os testes
make test

# Executar apenas testes unitários
make test-unit

# Executar apenas testes de integração
make test-integration

# Executar testes de documentação
make test-doc

# Executar todos os testes incluindo documentação
make test-all

# Executar testes e gerar relatório de cobertura
make coverage

# Executar benchmarks
make bench

# Pipeline completo de CI
make ci

# Preparar para commit (formatar, lint, testar)
make pre-commit
```

## Cobertura de Código

### Gerando Relatório de Cobertura

```bash
# Instalar tarpaulin (apenas uma vez)
cargo install cargo-tarpaulin

# Gerar relatório HTML
make coverage

# Gerar e abrir relatório no navegador
make coverage-open

# Gerar relatório XML para CI
cargo tarpaulin --out xml
```

### Interpretando a Cobertura

- **Meta**: > 80% de cobertura geral
- **Crítico**: > 90% em módulos de autenticação e erro
- **Aceitável**: > 70% em módulos auxiliares

## Benchmarks

### Executando Benchmarks

```bash
# Executar todos os benchmarks
make bench

# Salvar baseline para comparação
make bench-save

# Comparar com baseline salvo
make bench-compare

# Executar benchmark específico
cargo bench benchmark_client_creation
```

### Benchmarks Disponíveis

- `benchmark_client_creation`: Criação de cliente
- `benchmark_env_manager_load`: Carregamento de configurações
- `benchmark_oauth_flow_creation`: Criação de fluxo OAuth
- `benchmark_api_call`: Chamadas de API
- `benchmark_json_parsing`: Parsing de JSON
- `benchmark_url_construction`: Construção de URLs
- `benchmark_validation`: Validações
- `benchmark_concurrent_api_calls`: Chamadas concorrentes

## Mocking

### Usando Mockito

```rust
use mockito::{mock, Matcher};

#[tokio::test]
async fn test_api_call() {
    let _m = mock("GET", "/user")
        .with_status(200)
        .with_body(r#"{"id": 123}"#)
        .create();

    // Seu teste aqui
}
```

### Usando os Mocks Utilitários

```rust
use crate::mocks::{mock_authenticated_user, MockServer};

#[tokio::test]
async fn test_complete_flow() {
    let _mocks = MockServer::new()
        .with_authenticated_user()
        .with_teams()
        .with_spaces("123")
        .build();

    // Seu teste aqui
}
```

## Variáveis de Ambiente para Testes

Os testes requerem as seguintes variáveis de ambiente:

```bash
CLICKUP_CLIENT_ID=test_client_id
CLICKUP_CLIENT_SECRET=test_client_secret
```

### Criar arquivo .env de teste

```bash
make test-env
```

Isso criará um arquivo `.env.test` com valores padrão para testes.

## CI/CD

### GitHub Actions

O projeto usa GitHub Actions para CI/CD. Os workflows estão em `.github/workflows/`:

- **tests.yml**: Pipeline principal de testes

#### Jobs do CI

1. **Test**: Executa testes em múltiplas versões do Rust (stable, beta, nightly)
2. **Coverage**: Gera e envia cobertura para Codecov
3. **Integration**: Executa testes de integração com mock server
4. **Benchmark**: Executa e salva resultados de benchmarks

### Executar CI Localmente

```bash
# Simular pipeline CI completo
make ci
```

## Estratégias de Teste

### 1. Test-Driven Development (TDD)

Recomendamos seguir TDD para novas funcionalidades:

1. Escrever teste que falha
2. Implementar código mínimo para passar
3. Refatorar mantendo testes verdes

### 2. Testes de Regressão

- Sempre adicionar testes para bugs corrigidos
- Manter suite de testes de regressão em `tests/regression/`

### 3. Testes de Propriedades

Usar QuickCheck para testes baseados em propriedades:

```rust
use quickcheck_macros::quickcheck;

#[quickcheck]
fn prop_url_construction(endpoint: String) -> bool {
    // Propriedade a ser testada
    true
}
```

### 4. Testes de Snapshot

Usar Insta para testes de snapshot de respostas complexas:

```rust
use insta::assert_snapshot;

#[test]
fn test_complex_response() {
    let response = get_complex_data();
    assert_snapshot!(response);
}
```

## Boas Práticas

### 1. Isolamento de Testes

- Usar `temp-env` para isolar variáveis de ambiente
- Criar novos mocks para cada teste
- Não depender de ordem de execução

### 2. Nomenclatura

- Testes unitários: `test_<função>_<cenário>`
- Testes de integração: `test_<fluxo>_<resultado>`
- Benchmarks: `benchmark_<operação>`

### 3. Organização

- Agrupar testes relacionados em módulos
- Usar `#[cfg(test)]` para código de teste
- Separar fixtures e helpers em módulos próprios

### 4. Assertions

- Preferir `assert_eq!` e `assert_ne!` sobre `assert!`
- Usar `pretty_assertions` para comparações complexas
- Adicionar mensagens descritivas em assertions

### 5. Testes Assíncronos

```rust
#[tokio::test]
async fn test_async_operation() {
    // Use tokio::test para testes assíncronos
}
```

## Debugging de Testes

### Executar teste específico com output

```bash
RUST_LOG=debug cargo test test_name -- --nocapture
```

### Usar debugger

```bash
# Com lldb
rust-lldb target/debug/deps/test_binary

# Com gdb
rust-gdb target/debug/deps/test_binary
```

### Variáveis de ambiente úteis

```bash
# Mostrar backtrace completo em erros
RUST_BACKTRACE=1 cargo test

# Mostrar backtrace completo
RUST_BACKTRACE=full cargo test

# Debug de macros
RUST_LOG=debug cargo test
```

## Checklist de Testes

Antes de fazer commit ou criar PR, verifique:

- [ ] Todos os testes passam (`make test`)
- [ ] Código está formatado (`make fmt`)
- [ ] Sem warnings do clippy (`make lint`)
- [ ] Cobertura adequada para novo código
- [ ] Testes de integração para novas features
- [ ] Documentação atualizada
- [ ] Benchmarks não regressaram significativamente

## Resolução de Problemas Comuns

### 1. Testes falhando por timeout

```rust
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
#[timeout(Duration::from_secs(10))]
async fn test_with_timeout() {
    // teste
}
```

### 2. Conflitos de porta em testes

Use portas dinâmicas ou diferentes para cada teste:

```rust
let port = 8888 + (test_id % 1000);
```

### 3. Testes intermitentes

- Adicionar delays apropriados
- Usar mocks determinísticos
- Verificar condições de corrida

### 4. Variáveis de ambiente interferindo

Sempre usar `temp-env` para isolar:

```rust
temp_env::with_var("VAR", Some("value"), || {
    // teste isolado
});
```

## Métricas de Qualidade

### Targets de Qualidade

- **Cobertura de Código**: > 80%
- **Tempo de Execução**: < 30 segundos para suite completa
- **Taxa de Sucesso**: 100% em CI
- **Complexidade Ciclomática**: < 10 por função

### Monitoramento

- Codecov para tracking de cobertura
- GitHub Actions para CI
- Criterion para tracking de performance

## Contribuindo com Testes

Ao contribuir com o projeto:

1. Adicione testes para qualquer nova funcionalidade
2. Mantenha cobertura existente
3. Siga as convenções de nomenclatura
4. Documente comportamentos complexos
5. Execute suite completa antes de PR

## Recursos Adicionais

- [Rust Book - Testing]https://doc.rust-lang.org/book/ch11-00-testing.html
- [Tokio Testing]https://tokio.rs/tokio/topics/testing
- [Mockito Docs]https://docs.rs/mockito/
- [Criterion.rs]https://bheisler.github.io/criterion.rs/book/
- [Cargo Tarpaulin]https://github.com/xd009642/tarpaulin