-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUsersModuleTests.cs
More file actions
188 lines (156 loc) · 6.39 KB
/
UsersModuleTests.cs
File metadata and controls
188 lines (156 loc) · 6.39 KB
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
using System.Net.Http.Json;
using MeAjudaAi.E2E.Tests.Base;
namespace MeAjudaAi.E2E.Tests.Integration;
/// <summary>
/// Testes de integração para endpoints do módulo Users
/// </summary>
public class UsersModuleTests : TestContainerTestBase
{
[Fact]
public async Task GetUsers_ShouldReturnOkWithPaginatedResult()
{
// Act
var response = await ApiClient.GetAsync("/api/v1/users?pageNumber=1&pageSize=10");
// Assert
response.StatusCode.Should().BeOneOf(
HttpStatusCode.OK,
HttpStatusCode.NotFound // Aceitável se ainda não existem usuários
);
if (response.StatusCode == HttpStatusCode.OK)
{
var content = await response.Content.ReadAsStringAsync();
content.Should().NotBeNullOrEmpty();
// Verifica se é JSON válido
var jsonDocument = System.Text.Json.JsonDocument.Parse(content);
jsonDocument.Should().NotBeNull();
}
}
[Fact]
public async Task CreateUser_WithValidData_ShouldReturnCreatedOrConflict()
{
// Arrange
AuthenticateAsAdmin(); // CreateUser requer role admin
var createUserRequest = new CreateUserRequest
{
Username = $"testuser_{Guid.NewGuid():N}",
Email = $"test_{Guid.NewGuid():N}@example.com",
FirstName = "Test",
LastName = "User"
};
// Act
var response = await ApiClient.PostAsJsonAsync("/api/v1/users", createUserRequest, JsonOptions);
// Assert
response.StatusCode.Should().BeOneOf(
HttpStatusCode.Created, // Sucesso
HttpStatusCode.Conflict, // Usuário já existe
HttpStatusCode.BadRequest // Erro de validação
);
if (response.StatusCode == HttpStatusCode.Created)
{
var content = await response.Content.ReadAsStringAsync();
content.Should().NotBeNullOrEmpty();
var createdUser = System.Text.Json.JsonSerializer.Deserialize<CreateUserResponse>(content, JsonOptions);
createdUser.Should().NotBeNull();
createdUser!.UserId.Should().NotBeEmpty();
}
}
// TODO: Create GitHub issue #<TBD> to track E2E authentication infrastructure refactor.
// 13+ E2E tests affected by ConfigurableTestAuthenticationHandler race condition.
[Fact(Skip = "AUTH: Returns 403 Forbidden instead of expected 400 BadRequest. Same authentication issue as other E2E tests - ConfigurableTestAuthenticationHandler with SetAllowUnauthenticated(true) causing race condition where admin config isn't applied before authorization check. Requires refactor to use proper test authentication setup.")]
public async Task CreateUser_WithInvalidData_ShouldReturnBadRequest()
{
// Arrange
AuthenticateAsAdmin(); // CreateUser requer role admin (AdminOnly policy)
var invalidRequest = new CreateUserRequest
{
Username = "", // Inválido: username vazio
Email = "invalid-email", // Inválido: email mal formatado
FirstName = "",
LastName = ""
};
// Act
var response = await ApiClient.PostAsJsonAsync("/api/v1/users", invalidRequest, JsonOptions);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
}
[Fact]
public async Task GetUserById_WithNonExistentId_ShouldReturnNotFound()
{
// Arrange
AuthenticateAsAdmin(); // GetUserById requer autorização "SelfOrAdmin"
var nonExistentId = Guid.NewGuid();
// Act
var response = await ApiClient.GetAsync($"/api/v1/users/{nonExistentId}");
// Assert
response.StatusCode.Should().Be(HttpStatusCode.NotFound);
}
[Fact]
public async Task GetUserByEmail_WithNonExistentEmail_ShouldReturnNotFound()
{
// Arrange
AuthenticateAsAdmin(); // GetUserByEmail requer autorização "AdminOnly"
var nonExistentEmail = $"nonexistent_{Guid.NewGuid():N}@example.com";
// Act
var response = await ApiClient.GetAsync($"/api/v1/users/by-email/{nonExistentEmail}");
// Assert
response.StatusCode.Should().Be(HttpStatusCode.NotFound);
}
[Fact]
public async Task UpdateUser_WithNonExistentId_ShouldReturnNotFound()
{
// Arrange
AuthenticateAsAdmin(); // UpdateUserProfile requer autorização (SelfOrAdmin policy)
var nonExistentId = Guid.NewGuid();
var updateRequest = new UpdateUserProfileRequest
{
FirstName = "Updated",
LastName = "User",
Email = $"updated_{Guid.NewGuid():N}@example.com"
};
// Act
var response = await ApiClient.PutAsJsonAsync($"/api/v1/users/{nonExistentId}/profile", updateRequest, JsonOptions);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.NotFound);
}
[Fact]
public async Task DeleteUser_WithNonExistentId_ShouldReturnNotFound()
{
// Arrange
AuthenticateAsAdmin(); // DELETE requer autorização Admin
var nonExistentId = Guid.NewGuid();
// Act
var response = await ApiClient.DeleteAsync($"/api/v1/users/{nonExistentId}");
// Assert
response.StatusCode.Should().Be(HttpStatusCode.NotFound);
}
[Fact]
public async Task UserEndpoints_ShouldHandleInvalidGuids()
{
// Arrange
AuthenticateAsAdmin(); // GET requer autorização
// Act & Assert - Quando o constraint de GUID não bate, a rota retorna 404
var invalidGuidResponse = await ApiClient.GetAsync("/api/v1/users/invalid-guid");
invalidGuidResponse.StatusCode.Should().Be(HttpStatusCode.NotFound);
}
}
/// <summary>
/// DTOs simples para teste (para evitar dependências complexas)
/// </summary>
public record CreateUserRequest
{
public string Username { get; init; } = string.Empty;
public string Email { get; init; } = string.Empty;
public string FirstName { get; init; } = string.Empty;
public string LastName { get; init; } = string.Empty;
}
public record CreateUserResponse
{
public Guid UserId { get; init; }
public string Message { get; init; } = string.Empty;
}
public record UpdateUserProfileRequest
{
public string FirstName { get; init; } = string.Empty;
public string LastName { get; init; } = string.Empty;
public string Email { get; init; } = string.Empty;
}