refactor(settings): one load-change-save update for all settings

This commit is contained in:
lobo committed 2026-09-30 13:41:56 +02:00
1 parent fb51f836a8
commit cf21f4a654
7 files changed
+109 -110

No files matched your search

@@ -67,7 +67,7 @@ class UserRepositoryTest extends AbstractPersistenceTest {
// The delete request commits after the settings request loaded the user.
jdbc.update("UPDATE users SET deleted_at = NOW() WHERE id = ?", user.getId());
userRepository.updateSettings(user.getId(), "RaceName", UserSettings.builder().language("de").theme("dark").build());
updateSettings(user.getId(), "RaceName", UserSettings.builder().language("de").theme("dark").build());
entityManager.flush();
assertNotNull(jdbc.queryForObject("SELECT deleted_at FROM users WHERE id = ?", Object.class, user.getId()));
@@ -113,7 +113,7 @@ class UserRepositoryTest extends AbstractPersistenceTest {
.build();
// Act
userRepository.updateSettings(userEntity.getId(), null, settings);
updateSettings(userEntity.getId(), null, settings);
// Assert: the Steam ID changes only through the Steam link
var updatedUser = entityManager.find(UserEntity.class, userEntity.getId());
@@ -197,7 +197,7 @@ class UserRepositoryTest extends AbstractPersistenceTest {
void updateSettings_UnknownUser() {
var settings = UserSettings.builder().language("en").theme("light").build();
assertThrows(UserNotFoundException.class, () -> userRepository.updateSettings(-1L, null, settings));
assertThrows(UserNotFoundException.class, () -> updateSettings(-1L, null, settings));
}
@Test
@@ -224,7 +224,7 @@ class UserRepositoryTest extends AbstractPersistenceTest {
var settings = UserSettings.builder().language("en").theme("light").build();
// Act
userRepository.updateSettings(owner.getId(), "Lobo", settings);
updateSettings(owner.getId(), "Lobo", settings);
entityManager.flush();
// Assert
@@ -243,7 +243,7 @@ class UserRepositoryTest extends AbstractPersistenceTest {
.registrationDate(LocalDateTime.now())
.build());
userRepository.updateSettings(userEntity.getId(), "Lobo",
updateSettings(userEntity.getId(), "Lobo",
UserSettings.builder().language("de").theme("dark").publicProfile(true).build());
entityManager.flush();
entityManager.clear();
@@ -259,10 +259,11 @@ class UserRepositoryTest extends AbstractPersistenceTest {
.enabled(true)
.registrationDate(LocalDateTime.now())
.build());
userRepository.updateAppearance(userEntity.getId(), new Appearance("pink", "sharp", false, 220L, null, true));
userRepository.update(userEntity.getId(),
user -> user.getSettings().setAppearance(new Appearance("pink", "sharp", false, 220L, null, true)));
entityManager.flush();
userRepository.updateSettings(userEntity.getId(), null,
updateSettings(userEntity.getId(), null,
UserSettings.builder().language("de").theme("dark").build());
entityManager.flush();
entityManager.clear();
@@ -283,7 +284,7 @@ class UserRepositoryTest extends AbstractPersistenceTest {
.getSettings().getProfileStyle());
ProfileStyle style = new ProfileStyle("pink", "sharp", 620L, 1086940L);
userRepository.updateProfileStyle(userEntity.getId(), style);
userRepository.update(userEntity.getId(), user -> user.getSettings().setProfileStyle(style));
entityManager.flush();
entityManager.clear();
@@ -304,10 +305,10 @@ class UserRepositoryTest extends AbstractPersistenceTest {
List<Tile> dashboard = List.of(new Tile("STATS_TREND", "L"), new Tile("PLAYING", "S"));
List<Tile> profile = List.of(new Tile("STATS_PILE", "M"), new Tile("SUMMARY", "S"));
userRepository.updateDashboardTiles(userEntity.getId(), dashboard);
userRepository.updateProfileTiles(userEntity.getId(), profile);
userRepository.update(userEntity.getId(), user -> user.getSettings().setDashboardTiles(dashboard));
userRepository.update(userEntity.getId(), user -> user.getSettings().setProfileTiles(profile));
entityManager.flush();
userRepository.updateSettings(userEntity.getId(), null,
updateSettings(userEntity.getId(), null,
UserSettings.builder().language("de").theme("dark").build());
entityManager.flush();
entityManager.clear();
@@ -327,13 +328,13 @@ class UserRepositoryTest extends AbstractPersistenceTest {
.build());
assertNull(findByEmail("favorite@example.com").orElseThrow().getSettings().getFavoritePlatform());
userRepository.updateFavoritePlatform(userEntity.getId(), "Switch");
userRepository.update(userEntity.getId(), user -> user.getSettings().setFavoritePlatform("Switch"));
entityManager.flush();
entityManager.clear();
assertEquals("Switch", findByEmail("favorite@example.com").orElseThrow().getSettings()
.getFavoritePlatform());
userRepository.updateFavoritePlatform(userEntity.getId(), null);
userRepository.update(userEntity.getId(), user -> user.getSettings().setFavoritePlatform(null));
entityManager.flush();
entityManager.clear();
assertNull(findByEmail("favorite@example.com").orElseThrow().getSettings().getFavoritePlatform());
@@ -347,18 +348,23 @@ class UserRepositoryTest extends AbstractPersistenceTest {
.enabled(true)
.registrationDate(LocalDateTime.now())
.build());
userRepository.updateDashboardTiles(userEntity.getId(), List.of(new Tile("PLAYING", "S")));
userRepository.update(userEntity.getId(),
user -> user.getSettings().setDashboardTiles(List.of(new Tile("PLAYING", "S"))));
entityManager.flush();
userRepository.updateDashboardTiles(userEntity.getId(), null);
userRepository.update(userEntity.getId(), user -> user.getSettings().setDashboardTiles(null));
entityManager.flush();
entityManager.clear();
assertNull(findByEmail("reset@example.com").orElseThrow().getSettings().getDashboardTiles());
}
@Test
void updateAppearance_UnknownUser() {
assertThrows(UserNotFoundException.class, () -> userRepository.updateAppearance(-1L, Appearance.DEFAULT));
private void updateSettings(long userId, String displayName, UserSettings settings) {
userRepository.update(userId, user -> {
user.setDisplayName(displayName);
user.getSettings().setLanguage(settings.getLanguage());
user.getSettings().setTheme(settings.getTheme());
user.getSettings().setPublicProfile(settings.isPublicProfile());
});
}
}
@@ -13,17 +13,21 @@ import auth_service.modules.user.persistence.UserRepository;
import auth_service.shared.security.TokenGenerator;
import auth_service.shared.test.AbstractUnitTest;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
/**
@@ -60,15 +64,16 @@ class UserServiceTest extends AbstractUnitTest {
userService.updateDashboardTiles(1L, List.of(new Tile("PLAYING", "S"), new Tile("PLAYING", "L")));
userService.updateProfileTiles(1L, List.of(new Tile("SUMMARY", "M"), new Tile("SUMMARY", "S")));
verify(userRepository).updateDashboardTiles(1L, List.of(new Tile("PLAYING", "S")));
verify(userRepository).updateProfileTiles(1L, List.of(new Tile("SUMMARY", "M")));
List<User> changed = appliedChanges(2);
assertEquals(List.of(new Tile("PLAYING", "S")), changed.get(0).getSettings().getDashboardTiles());
assertEquals(List.of(new Tile("SUMMARY", "M")), changed.get(1).getSettings().getProfileTiles());
}
@Test
void updateDashboardTiles_NullStaysNull() {
userService.updateDashboardTiles(1L, null);
verify(userRepository).updateDashboardTiles(1L, null);
assertNull(appliedChanges(1).getFirst().getSettings().getDashboardTiles());
}
@Test
@@ -77,7 +82,7 @@ class UserServiceTest extends AbstractUnitTest {
userService.updateUserSettings(1L, null, userSettings);
verify(userRepository).updateSettings(1L, null, userSettings);
appliedChanges(1);
verify(userRepository, never()).clearSteamId(anyLong());
verify(userRepository, never()).setVerifiedSteamId(anyLong(), anyLong());
verifyNoInteractions(tokenGenerator);
@@ -92,7 +97,7 @@ class UserServiceTest extends AbstractUnitTest {
// Act & Assert
assertThrows(DisplayNameAlreadyInUseException.class,
() -> userService.updateUserSettings(1L, "Lobo", userSettings));
verify(userRepository, never()).updateSettings(anyLong(), any(), any());
verify(userRepository, never()).update(anyLong(), any());
}
@Test
@@ -105,7 +110,9 @@ class UserServiceTest extends AbstractUnitTest {
userService.updateUserSettings(1L, "Lobo", userSettings);
// Assert
verify(userRepository).updateSettings(1L, "Lobo", userSettings);
User changed = appliedChanges(1).getFirst();
assertEquals("Lobo", changed.getDisplayName());
assertEquals("en", changed.getSettings().getLanguage());
}
private static final long STEAM_ID = 76561198000000001L;
@@ -165,7 +172,28 @@ class UserServiceTest extends AbstractUnitTest {
userService.updateAppearance(1L, appearance);
verify(userRepository).updateAppearance(1L, appearance);
assertEquals(appearance, appliedChanges(1).getFirst().getSettings().getAppearance());
verifyNoInteractions(tokenGenerator);
}
@Test
void updateFavoritePlatform_StoresItStripped() {
userService.updateFavoritePlatform(1L, " Switch ");
assertEquals("Switch", appliedChanges(1).getFirst().getSettings().getFavoritePlatform());
}
/**
* Runs each change user 1 got on a fresh user with default settings.
*/
@SuppressWarnings("unchecked")
private List<User> appliedChanges(int count) {
ArgumentCaptor<Consumer<User>> change = ArgumentCaptor.forClass(Consumer.class);
verify(userRepository, times(count)).update(eq(1L), change.capture());
return change.getAllValues().stream().map(each -> {
User user = User.builder().id(1L).settings(UserSettings.builder().build()).build();
each.accept(user);
return user;
}).toList();
}
}