Skip to content

Commit

Permalink
Merge pull request #273 from cryptomator/feature/flyway-clean
Browse files Browse the repository at this point in the history
Improve Testability and Test Performance
  • Loading branch information
overheadhunter authored Apr 28, 2024
2 parents c01fa9d + d7e8e09 commit aa7d217
Show file tree
Hide file tree
Showing 70 changed files with 2,506 additions and 1,498 deletions.
77 changes: 75 additions & 2 deletions backend/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
<version>1.4.0-SNAPSHOT</version>

<properties>
<compiler-plugin.version>3.12.1</compiler-plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.jdk.version>21</project.jdk.version>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
Expand All @@ -16,7 +15,11 @@
<quarkus.platform.version>3.8.2</quarkus.platform.version>
<quarkus.jib.base-jvm-image>eclipse-temurin:21-jre</quarkus.jib.base-jvm-image> <!-- irrelevant for -Pnative -->
<jwt.version>4.4.0</jwt.version>
<compiler-plugin.version>3.12.1</compiler-plugin.version>
<dependency-plugin.version>3.6.1</dependency-plugin.version>
<surefire-plugin.version>3.2.3</surefire-plugin.version>
<failsafe-plugin.version>3.2.5</failsafe-plugin.version>
<junit-tree-reporter.version>1.2.1</junit-tree-reporter.version>
</properties>

<dependencyManagement>
Expand Down Expand Up @@ -152,16 +155,86 @@
<release>${project.jdk.version}</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>${dependency-plugin.version}</version>
<executions>
<execution>
<id>jar-paths-to-properties</id>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<dependencies>
<dependency>
<groupId>me.fabriciorby</groupId>
<artifactId>maven-surefire-junit5-tree-reporter</artifactId>
<version>${junit-tree-reporter.version}</version>
</dependency>
</dependencies>
<configuration>
<argLine>-javaagent:${net.bytebuddy:byte-buddy-agent:jar}</argLine>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
<reportFormat>plain</reportFormat>
<consoleOutputReporter>
<disable>false</disable>
</consoleOutputReporter>
<statelessTestsetInfoReporter implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
<printStacktraceOnError>true</printStacktraceOnError>
<printStacktraceOnFailure>true</printStacktraceOnFailure>
<printStdoutOnError>true</printStdoutOnError>
<printStdoutOnFailure>true</printStdoutOnFailure>
<printStdoutOnSuccess>false</printStdoutOnSuccess>
<printStderrOnError>true</printStderrOnError>
<printStderrOnFailure>true</printStderrOnFailure>
<printStderrOnSuccess>false</printStderrOnSuccess>
</statelessTestsetInfoReporter>
</configuration>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${failsafe-plugin.version}</version>
<dependencies>
<dependency>
<groupId>me.fabriciorby</groupId>
<artifactId>maven-surefire-junit5-tree-reporter</artifactId>
<version>${junit-tree-reporter.version}</version>
</dependency>
</dependencies>
<configuration>
<argLine>-javaagent:${net.bytebuddy:byte-buddy-agent:jar}</argLine>
<reportFormat>plain</reportFormat>
<consoleOutputReporter>
<disable>false</disable>
</consoleOutputReporter>
<statelessTestsetInfoReporter implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
<printStacktraceOnError>true</printStacktraceOnError>
<printStacktraceOnFailure>true</printStacktraceOnFailure>
<printStdoutOnError>true</printStdoutOnError>
<printStdoutOnFailure>true</printStdoutOnFailure>
<printStdoutOnSuccess>false</printStdoutOnSuccess>
<printStderrOnError>true</printStderrOnError>
<printStderrOnFailure>true</printStderrOnFailure>
<printStderrOnSuccess>false</printStderrOnSuccess>
</statelessTestsetInfoReporter>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Expand All @@ -177,7 +250,7 @@
<plugins>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<version>${failsafe-plugin.version}</version>
<executions>
<execution>
<goals>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ private Predicate<UserRepresentation> notSyncerUser() {

private User mapToUser(UserRepresentation userRepresentation) {
var userEntity = new User();
userEntity.id = userRepresentation.getId();
userEntity.name = userRepresentation.getUsername();
userEntity.email = userRepresentation.getEmail();
parsePictureUrl(userRepresentation.getAttributes()).ifPresent(it -> userEntity.pictureUrl = it);
userEntity.setId(userRepresentation.getId());
userEntity.setName(userRepresentation.getUsername());
userEntity.setEmail(userRepresentation.getEmail());
parsePictureUrl(userRepresentation.getAttributes()).ifPresent(userEntity::setPictureUrl);
return userEntity;
}

Expand All @@ -96,9 +96,9 @@ List<Group> groups(RealmResource realm) {
// TODO add sub groups and the members of the sub group to it too using `group.getSubGroups()` recursively
var members = deepCollectMembers(realm, group.getId());
var groupEntity = new Group();
groupEntity.id = group.getId();
groupEntity.name = group.getName();
groupEntity.members = members;
groupEntity.setId(group.getId());
groupEntity.setName(group.getName());
groupEntity.setMembers(members);
return groupEntity;
}).toList();
}
Expand Down
33 changes: 20 additions & 13 deletions backend/src/main/java/org/cryptomator/hub/RemoteUserPuller.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,26 @@
@ApplicationScoped
public class RemoteUserPuller {

@Inject
Authority.Repository authorityRepo;
@Inject
Group.Repository groupRepo;
@Inject
User.Repository userRepo;
@Inject
RemoteUserProvider remoteUserProvider;

@Scheduled(every = "{hub.keycloak.syncer-period}")
void sync() {
var keycloakGroups = remoteUserProvider.groups().stream().collect(Collectors.toMap(g -> g.id, Function.identity()));
var keycloakUsers = remoteUserProvider.users().stream().collect(Collectors.toMap(u -> u.id, Function.identity()));
var keycloakGroups = remoteUserProvider.groups().stream().collect(Collectors.toMap(Authority::getId, Function.identity()));
var keycloakUsers = remoteUserProvider.users().stream().collect(Collectors.toMap(Authority::getId, Function.identity()));
sync(keycloakGroups, keycloakUsers);
}

@Transactional
void sync(Map<String, Group> keycloakGroups, Map<String, User> keycloakUsers) {
var databaseGroups = Group.<Group>findAll().stream().collect(Collectors.toMap(g -> g.id, Function.identity()));
var databaseUsers = User.<User>findAll().stream().collect(Collectors.toMap(u -> u.id, Function.identity()));
var databaseGroups = groupRepo.findAll().stream().collect(Collectors.toMap(Authority::getId, Function.identity()));
var databaseUsers = userRepo.findAll().stream().collect(Collectors.toMap(Authority::getId, Function.identity()));
sync(keycloakGroups, keycloakUsers, databaseGroups, databaseUsers);
}

Expand All @@ -48,15 +54,15 @@ void sync(Map<String, Group> keycloakGroups, Map<String, User> keycloakUsers, Ma
<T extends Authority> void syncAddedAuthorities(Map<String, T> keycloakAuthorities, Map<String, T> databaseAuthorities) {
var addedAuthority = diff(keycloakAuthorities.keySet(), databaseAuthorities.keySet());
for (var id : addedAuthority) {
keycloakAuthorities.get(id).persist();
authorityRepo.persist(keycloakAuthorities.get(id));
}
}

//visible for testing
<T extends Authority> Set<String> syncDeletedAuthorities(Map<String, T> keycloakAuthorities, Map<String, T> databaseAuthorities) {
var deletedAuthorities = diff(databaseAuthorities.keySet(), keycloakAuthorities.keySet());
for (var id : deletedAuthorities) {
databaseAuthorities.get(id).delete();
authorityRepo.delete(keycloakAuthorities.get(id));
}
return deletedAuthorities;
}
Expand All @@ -67,10 +73,10 @@ void syncUpdatedUsers(Map<String, User> keycloakUsers, Map<String, User> databas
for (var id : updatedUsers) {
var dbUser = databaseUsers.get(id);
var kcUser = keycloakUsers.get(id);
dbUser.pictureUrl = kcUser.pictureUrl;
dbUser.name = kcUser.name;
dbUser.email = kcUser.email;
dbUser.persist();
dbUser.setPictureUrl(kcUser.getPictureUrl());
dbUser.setName(kcUser.getName());
dbUser.setEmail(kcUser.getEmail());
userRepo.persist(dbUser);
}
}

Expand All @@ -81,10 +87,11 @@ void syncUpdatedGroups(Map<String, Group> keycloakGroups, Map<String, Group> dat
var dbGroup = databaseGroups.get(id);
var kcGroup = keycloakGroups.get(id);

dbGroup.name = kcGroup.name;
dbGroup.setName(kcGroup.getName());

dbGroup.members.addAll(diff(kcGroup.members, dbGroup.members));
dbGroup.members.removeAll(diff(dbGroup.members, kcGroup.members));
dbGroup.getMembers().addAll(diff(kcGroup.getMembers(), dbGroup.getMembers()));
dbGroup.getMembers().removeAll(diff(dbGroup.getMembers(), kcGroup.getMembers()));
// TODO why don't we run dbGroup.persist()?
}
}

Expand Down
Loading

0 comments on commit aa7d217

Please sign in to comment.