|
|
@@ -51,14 +51,17 @@ class MerchantSubaccountApplicationServiceTest {
|
|
|
when(relationService.selectStoreIdsBySubaccountUserId(20L)).thenReturn(List.of());
|
|
|
MerchantSubaccountCreateRequest request = new MerchantSubaccountCreateRequest();
|
|
|
request.setPhone("0912345678");
|
|
|
+ request.setUserName("store_staff");
|
|
|
request.setName("分店账号");
|
|
|
request.setPassword("password");
|
|
|
request.setStoreIds(List.of(7L));
|
|
|
|
|
|
- service.create(10L, request);
|
|
|
+ var created = service.create(10L, request);
|
|
|
+ assertEquals("store_staff", created.getUserName());
|
|
|
|
|
|
ArgumentCaptor<InfoUser> captor = ArgumentCaptor.forClass(InfoUser.class);
|
|
|
verify(infoUserService).insertInfoUser(captor.capture());
|
|
|
+ assertEquals("store_staff", captor.getValue().getUserName());
|
|
|
assertEquals("0912345678", captor.getValue().getTelPhone());
|
|
|
assertNull(captor.getValue().getPhone());
|
|
|
verify(businessPhoneService).ensureUnique("0912345678", null);
|
|
|
@@ -166,4 +169,74 @@ class MerchantSubaccountApplicationServiceTest {
|
|
|
user.setVoIPToken("voip-" + userId);
|
|
|
return user;
|
|
|
}
|
|
|
+ @Test
|
|
|
+ void missingUsernameDoesNotFallBackToPhone() {
|
|
|
+ var fixture = new UsernameFixture();
|
|
|
+ fixture.request.setUserName(" ");
|
|
|
+ try (MockedStatic<MessageUtils> messages = mockStatic(MessageUtils.class)) {
|
|
|
+ messages.when(() -> MessageUtils.message(anyString())).thenAnswer(i -> i.getArgument(0));
|
|
|
+ assertEquals("merchant.subaccount.username.required", assertThrows(ServiceException.class,
|
|
|
+ () -> fixture.service.create(10L, fixture.request)).getMessage());
|
|
|
+ }
|
|
|
+ org.mockito.Mockito.verify(fixture.users, org.mockito.Mockito.never()).insertInfoUser(any());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void usernameCannotCollideWithAnotherAccount() {
|
|
|
+ var fixture = new UsernameFixture();
|
|
|
+ InfoUser other = new InfoUser(); other.setUserId(99L);
|
|
|
+ when(fixture.users.getinfouserName("staff")).thenReturn(other);
|
|
|
+ try (MockedStatic<MessageUtils> messages = mockStatic(MessageUtils.class)) {
|
|
|
+ messages.when(() -> MessageUtils.message(anyString())).thenAnswer(i -> i.getArgument(0));
|
|
|
+ assertEquals("merchant.subaccount.username.exists", assertThrows(ServiceException.class,
|
|
|
+ () -> fixture.service.create(10L, fixture.request)).getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void renameExistingSubaccountPreservesContactAndRevokesSessions() {
|
|
|
+ var fixture = new UsernameFixture();
|
|
|
+ var request = new com.ruoyi.app.user.dto.MerchantSubaccountUpdateRequest();
|
|
|
+ request.setUserName(" new_staff "); request.setStoreIds(List.of(7L));
|
|
|
+ var view = fixture.service.update(10L, 20L, request);
|
|
|
+ assertEquals("new_staff", view.getUserName());
|
|
|
+ assertEquals("0912345678", view.getPhone());
|
|
|
+ ArgumentCaptor<InfoUser> update = ArgumentCaptor.forClass(InfoUser.class);
|
|
|
+ verify(fixture.users).updateInfoUser(update.capture());
|
|
|
+ assertEquals("new_staff", update.getValue().getUserName());
|
|
|
+ assertNull(update.getValue().getTelPhone());
|
|
|
+ verify(fixture.sessions).revokeAll(20L);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void unchangedUsernameCanBelongToSelfWithoutRevokingSessions() {
|
|
|
+ var fixture = new UsernameFixture();
|
|
|
+ when(fixture.users.getinfouserName("0912345678")).thenReturn(fixture.target);
|
|
|
+ var request = new com.ruoyi.app.user.dto.MerchantSubaccountUpdateRequest();
|
|
|
+ request.setUserName("0912345678"); request.setStoreIds(List.of(7L));
|
|
|
+ assertEquals("0912345678", fixture.service.update(10L, 20L, request).getUserName());
|
|
|
+ org.mockito.Mockito.verify(fixture.sessions, org.mockito.Mockito.never()).revokeAll(20L);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static class UsernameFixture {
|
|
|
+ final IInfoUserService users = mock(IInfoUserService.class);
|
|
|
+ final MerchantTokenSessionService sessions = mock(MerchantTokenSessionService.class);
|
|
|
+ final InfoUser target = new InfoUser();
|
|
|
+ final MerchantSubaccountCreateRequest request = new MerchantSubaccountCreateRequest();
|
|
|
+ final MerchantSubaccountApplicationService service;
|
|
|
+ UsernameFixture() {
|
|
|
+ var access = mock(MerchantStoreAccessService.class);
|
|
|
+ var relations = mock(IMerchantSubaccountStoreService.class);
|
|
|
+ service = new MerchantSubaccountApplicationService(users, relations, access,
|
|
|
+ mock(PosStoreMapper.class), sessions, mock(BusinessPhoneService.class));
|
|
|
+ when(access.getAccessibleStoreIds(10L)).thenReturn(Set.of(7L));
|
|
|
+ target.setUserId(20L); target.setUserType("5"); target.setDelFlag("0");
|
|
|
+ target.setMerchantOwnerId(10L); target.setUserName("0912345678"); target.setTelPhone("0912345678");
|
|
|
+ when(users.selectInfoUserByUserId(20L)).thenReturn(target);
|
|
|
+ when(users.updateInfoUser(any())).thenReturn(1);
|
|
|
+ request.setUserName("staff"); request.setPhone("0912345678");
|
|
|
+ request.setPassword("encrypted-password"); request.setStoreIds(List.of(7L));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|