Skip to content

Commit c031611

Browse files
authored
wip: version 0.1.3 (#13)
1 parent f2feb7f commit c031611

20 files changed

Lines changed: 613 additions & 205 deletions

.github/workflows/publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ jobs:
6060
uses: docker/metadata-action@v5
6161
with:
6262
images: |
63-
ghcr.io/${{ github.repository_owner }}/mediapi.core
63+
ghcr.io/${{ github.repository_owner }}/media-pi.core
6464
tags: |
6565
type=semver,pattern={{version}},enable=${{ contains(github.ref, 'refs/tags/v') }}
6666
type=semver,pattern={{major}}.{{minor}},enable=${{ contains(github.ref, 'refs/tags/v') }}

MediaPi.Core.Tests/Controllers/AccountsControllerTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,27 @@ public async Task GetAll_Manager_ReturnsOwn()
156156
Assert.That(result.Value!.First().Id, Is.EqualTo(_account1.Id));
157157
}
158158

159+
[Test]
160+
public async Task GetAll_Engineer_ReturnsAllWithLimitedInfo()
161+
{
162+
SetCurrentUser(3); // Engineer
163+
var result = await _controller.GetAll();
164+
Assert.That(result.Value, Is.Not.Null);
165+
Assert.That(result.Value!.Count(), Is.EqualTo(2)); // Should see all accounts
166+
167+
// Verify all accounts have Id and Name but empty UserIds
168+
foreach (var account in result.Value!)
169+
{
170+
Assert.That(account.Id, Is.GreaterThan(0)); // Should have valid Id
171+
Assert.That(account.Name, Is.Not.Null.And.Not.Empty); // Should have valid Name
172+
Assert.That(account.UserIds, Is.Empty); // Should have empty UserIds
173+
}
174+
175+
// Verify specific accounts are present
176+
var accountIds = result.Value!.Select(a => a.Id).ToList();
177+
Assert.That(accountIds, Is.EquivalentTo(new[] { _account1.Id, _account2.Id }));
178+
}
179+
159180
[Test]
160181
public async Task GetAccount_Manager_Other_Forbidden()
161182
{

MediaPi.Core.Tests/Controllers/AuthControllerTests.cs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,111 @@ public void Check_ReturnsNoContent_WhenAuthenticated()
214214
// Assert
215215
Assert.That(result, Is.TypeOf<NoContentResult>());
216216
}
217+
218+
[Test]
219+
public async Task Login_IncludesAccountIds_WhenUserIsManager()
220+
{
221+
// Arrange
222+
var account1 = new Account { Id = 1, Name = "Test Account 1" };
223+
var account2 = new Account { Id = 2, Name = "Test Account 2" };
224+
_dbContext.Accounts.AddRange(account1, account2);
225+
226+
var managerRole = new Role { Id = 100, RoleId = UserRoleConstants.AccountManager, Name = "Manager" };
227+
_dbContext.Roles.Add(managerRole);
228+
229+
string hashedPassword = BCrypt.Net.BCrypt.HashPassword("password123");
230+
var managerUser = new User
231+
{
232+
Id = 2,
233+
Email = "manager@example.com",
234+
Password = hashedPassword,
235+
FirstName = "Manager",
236+
LastName = "User",
237+
Patronymic = "",
238+
UserRoles =
239+
[
240+
new UserRole { UserId = 2, RoleId = managerRole.Id, Role = managerRole }
241+
],
242+
UserAccounts =
243+
[
244+
new UserAccount { UserId = 2, AccountId = account1.Id, Account = account1 },
245+
new UserAccount { UserId = 2, AccountId = account2.Id, Account = account2 }
246+
]
247+
};
248+
249+
_dbContext.Users.Add(managerUser);
250+
await _dbContext.SaveChangesAsync();
251+
252+
var credentials = new Credentials
253+
{
254+
Email = "manager@example.com",
255+
Password = "password123"
256+
};
257+
258+
_mockJwtUtils.Setup(x => x.GenerateJwtToken(It.IsAny<User>()))
259+
.Returns("manager-jwt-token");
260+
261+
// Act
262+
var result = await _controller.Login(credentials);
263+
264+
// Assert
265+
Assert.That(result.Result, Is.Null);
266+
Assert.That(result.Value, Is.Not.Null);
267+
Assert.That(result.Value, Is.TypeOf<UserViewItemWithJWT>());
268+
269+
var userView = result.Value as UserViewItemWithJWT;
270+
Assert.That(userView!.Token, Is.EqualTo("manager-jwt-token"));
271+
Assert.That(userView.Email, Is.EqualTo("manager@example.com"));
272+
Assert.That(userView.Roles, Contains.Item(UserRoleConstants.AccountManager));
273+
Assert.That(userView.AccountIds, Is.EquivalentTo(new[] { 1, 2 }));
274+
}
275+
276+
[Test]
277+
public async Task Login_EmptyAccountIds_WhenUserIsNotManager()
278+
{
279+
// Arrange
280+
var engineerRole = new Role { Id = 101, RoleId = UserRoleConstants.InstallationEngineer, Name = "Engineer" };
281+
_dbContext.Roles.Add(engineerRole);
282+
283+
string hashedPassword = BCrypt.Net.BCrypt.HashPassword("password123");
284+
var engineerUser = new User
285+
{
286+
Id = 3,
287+
Email = "engineer@example.com",
288+
Password = hashedPassword,
289+
FirstName = "Engineer",
290+
LastName = "User",
291+
Patronymic = "",
292+
UserRoles =
293+
[
294+
new UserRole { UserId = 3, RoleId = engineerRole.Id, Role = engineerRole }
295+
]
296+
};
297+
298+
_dbContext.Users.Add(engineerUser);
299+
await _dbContext.SaveChangesAsync();
300+
301+
var credentials = new Credentials
302+
{
303+
Email = "engineer@example.com",
304+
Password = "password123"
305+
};
306+
307+
_mockJwtUtils.Setup(x => x.GenerateJwtToken(It.IsAny<User>()))
308+
.Returns("engineer-jwt-token");
309+
310+
// Act
311+
var result = await _controller.Login(credentials);
312+
313+
// Assert
314+
Assert.That(result.Result, Is.Null);
315+
Assert.That(result.Value, Is.Not.Null);
316+
Assert.That(result.Value, Is.TypeOf<UserViewItemWithJWT>());
317+
318+
var userView = result.Value as UserViewItemWithJWT;
319+
Assert.That(userView!.Token, Is.EqualTo("engineer-jwt-token"));
320+
Assert.That(userView.Email, Is.EqualTo("engineer@example.com"));
321+
Assert.That(userView.Roles, Contains.Item(UserRoleConstants.InstallationEngineer));
322+
Assert.That(userView.AccountIds, Is.Empty); // Non-managers should have empty AccountIds
323+
}
217324
}

MediaPi.Core.Tests/Controllers/DeviceGroupsControllerTests.cs

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -173,18 +173,6 @@ public async Task GetGroup_Manager_Other_Forbidden()
173173
Assert.That(obj!.StatusCode, Is.EqualTo(StatusCodes.Status403Forbidden));
174174
}
175175

176-
[Test]
177-
public async Task UpdateGroup_Manager_CannotChangeAccount()
178-
{
179-
SetCurrentUser(2);
180-
var dto = new DeviceGroupUpdateItem { Name = "Renamed", AccountId = _account2.Id };
181-
var result = await _controller.UpdateGroup(_group1.Id, dto);
182-
Assert.That(result, Is.TypeOf<NoContentResult>());
183-
var grp = await _dbContext.DeviceGroups.FindAsync(_group1.Id);
184-
Assert.That(grp!.AccountId, Is.EqualTo(_account1.Id));
185-
Assert.That(grp.Name, Is.EqualTo("Renamed"));
186-
}
187-
188176
[Test]
189177
public async Task DeleteGroup_Admin_SetsDeviceNull()
190178
{
@@ -336,17 +324,6 @@ public async Task UpdateGroup_Manager_OtherGroup_Returns403()
336324
Assert.That(obj!.StatusCode, Is.EqualTo(StatusCodes.Status403Forbidden));
337325
}
338326

339-
[Test]
340-
public async Task UpdateGroup_Admin_InvalidAccount_Returns404()
341-
{
342-
SetCurrentUser(1); // Admin
343-
var dto = new DeviceGroupUpdateItem { AccountId = 999 };
344-
var result = await _controller.UpdateGroup(_group1.Id, dto);
345-
Assert.That(result, Is.TypeOf<ObjectResult>());
346-
var obj = result as ObjectResult;
347-
Assert.That(obj!.StatusCode, Is.EqualTo(StatusCodes.Status404NotFound));
348-
}
349-
350327
[Test]
351328
public async Task DeleteGroup_NoUser_Returns403()
352329
{
@@ -396,5 +373,17 @@ public async Task DeleteGroup_Manager_OwnGroup_Succeeds()
396373
var grp = await _dbContext.DeviceGroups.FindAsync(_group1.Id);
397374
Assert.That(grp, Is.Null);
398375
}
376+
377+
[Test]
378+
public async Task UpdateGroup_Manager_CanUpdateName()
379+
{
380+
SetCurrentUser(2);
381+
var dto = new DeviceGroupUpdateItem { Name = "Renamed" };
382+
var result = await _controller.UpdateGroup(_group1.Id, dto);
383+
Assert.That(result, Is.TypeOf<NoContentResult>());
384+
var grp = await _dbContext.DeviceGroups.FindAsync(_group1.Id);
385+
Assert.That(grp!.AccountId, Is.EqualTo(_account1.Id)); // AccountId should remain unchanged
386+
Assert.That(grp.Name, Is.EqualTo("Renamed"));
387+
}
399388
}
400389

MediaPi.Core.Tests/Controllers/DevicesControllerErrorTests.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ public async Task DeleteDevice_NonAdmin_Returns403()
309309
public async Task AssignGroup_NoUser_Returns403()
310310
{
311311
SetCurrentUser(null);
312-
var dto = new DeviceAssignGroupItem { DeviceGroupId = 1 };
312+
var dto = new Reference { Id = 1 };
313313
var result = await _controller.AssignGroup(1, dto);
314314
Assert.That(result, Is.TypeOf<ObjectResult>());
315315
var obj = result as ObjectResult;
@@ -320,42 +320,42 @@ public async Task AssignGroup_NoUser_Returns403()
320320
public async Task AssignGroup_RegularUser_Returns403()
321321
{
322322
SetCurrentUser(4); // Regular user
323-
var dto = new DeviceAssignGroupItem { DeviceGroupId = 1 };
323+
var dto = new Reference { Id = 1 };
324324
var result = await _controller.AssignGroup(1, dto);
325325
Assert.That(result, Is.TypeOf<ObjectResult>());
326326
var obj = result as ObjectResult;
327327
Assert.That(obj!.StatusCode, Is.EqualTo(StatusCodes.Status403Forbidden));
328328
}
329329

330-
// Error case tests for InitialAssignAccount endpoint
330+
// Error case tests for AssignAccount endpoint
331331
[Test]
332-
public async Task InitialAssignAccount_NoUser_Returns403()
332+
public async Task AssignAccount_NoUser_Returns403()
333333
{
334334
SetCurrentUser(null);
335-
var dto = new DeviceInitialAssignAccountItem { Name = "NewName", AccountId = 1 };
336-
var result = await _controller.InitialAssignAccount(1, dto);
335+
var dto = new Reference { Id = 1 };
336+
var result = await _controller.AssignAccount(1, dto);
337337
Assert.That(result, Is.TypeOf<ObjectResult>());
338338
var obj = result as ObjectResult;
339339
Assert.That(obj!.StatusCode, Is.EqualTo(StatusCodes.Status403Forbidden));
340340
}
341341

342342
[Test]
343-
public async Task InitialAssignAccount_RegularUser_Returns403()
343+
public async Task AssignAccount_RegularUser_Returns403()
344344
{
345345
SetCurrentUser(4); // Regular user
346-
var dto = new DeviceInitialAssignAccountItem { Name = "NewName", AccountId = 1 };
347-
var result = await _controller.InitialAssignAccount(1, dto);
346+
var dto = new Reference { Id = 1 };
347+
var result = await _controller.AssignAccount(1, dto);
348348
Assert.That(result, Is.TypeOf<ObjectResult>());
349349
var obj = result as ObjectResult;
350350
Assert.That(obj!.StatusCode, Is.EqualTo(StatusCodes.Status403Forbidden));
351351
}
352352

353353
[Test]
354-
public async Task InitialAssignAccount_ManagerCannotAssign_Returns403()
354+
public async Task AssignAccount_ManagerCannotAssign_Returns403()
355355
{
356356
SetCurrentUser(2); // Manager
357-
var dto = new DeviceInitialAssignAccountItem { Name = "NewName", AccountId = 1 };
358-
var result = await _controller.InitialAssignAccount(2, dto);
357+
var dto = new Reference { Id = 1 };
358+
var result = await _controller.AssignAccount(2, dto);
359359
Assert.That(result, Is.TypeOf<ObjectResult>());
360360
var obj = result as ObjectResult;
361361
Assert.That(obj!.StatusCode, Is.EqualTo(StatusCodes.Status403Forbidden));

0 commit comments

Comments
 (0)