1

event test + addmemberevent test

This commit is contained in:
Christoph
2020-04-19 15:09:18 +02:00
parent 4118d3f6b1
commit d1d6a2c951
10 changed files with 200 additions and 25 deletions

View File

@ -6,7 +6,7 @@ import lombok.Value;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import mops.gruppen2.domain.exception.GroupFullException; import mops.gruppen2.domain.exception.GroupFullException;
import mops.gruppen2.domain.exception.IdMismatchException; import mops.gruppen2.domain.exception.IdMismatchException;
import mops.gruppen2.domain.exception.UserAlreadyExistsException; import mops.gruppen2.domain.exception.UserExistsException;
import mops.gruppen2.domain.model.group.Group; import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.User; import mops.gruppen2.domain.model.group.User;
import mops.gruppen2.infrastructure.GroupCache; import mops.gruppen2.infrastructure.GroupCache;
@ -39,7 +39,7 @@ public class AddMemberEvent extends Event {
} }
@Override @Override
protected void applyEvent(Group group) throws UserAlreadyExistsException, GroupFullException { protected void applyEvent(Group group) throws UserExistsException, GroupFullException {
group.addMember(target, user); group.addMember(target, user);
log.trace("\t\t\t\t\tNeue Members: {}", group.getMembers()); log.trace("\t\t\t\t\tNeue Members: {}", group.getMembers());

View File

@ -2,11 +2,11 @@ package mops.gruppen2.domain.exception;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
public class UserAlreadyExistsException extends EventException { public class UserExistsException extends EventException {
private static final long serialVersionUID = -8150634358760194625L; private static final long serialVersionUID = -8150634358760194625L;
public UserAlreadyExistsException(String info) { public UserExistsException(String info) {
super(HttpStatus.INTERNAL_SERVER_ERROR, "User existiert bereits.", info); super(HttpStatus.INTERNAL_SERVER_ERROR, "User existiert bereits.", info);
} }
} }

View File

@ -10,7 +10,7 @@ import mops.gruppen2.domain.exception.GroupFullException;
import mops.gruppen2.domain.exception.IdMismatchException; import mops.gruppen2.domain.exception.IdMismatchException;
import mops.gruppen2.domain.exception.LastAdminException; import mops.gruppen2.domain.exception.LastAdminException;
import mops.gruppen2.domain.exception.NoAccessException; import mops.gruppen2.domain.exception.NoAccessException;
import mops.gruppen2.domain.exception.UserAlreadyExistsException; import mops.gruppen2.domain.exception.UserExistsException;
import mops.gruppen2.domain.exception.UserNotFoundException; import mops.gruppen2.domain.exception.UserNotFoundException;
import mops.gruppen2.domain.model.group.wrapper.Body; import mops.gruppen2.domain.model.group.wrapper.Body;
import mops.gruppen2.domain.model.group.wrapper.Description; import mops.gruppen2.domain.model.group.wrapper.Description;
@ -101,7 +101,7 @@ public class Group {
return memberships.get(userid).getRole(); return memberships.get(userid).getRole();
} }
public void addMember(String target, User user) throws UserAlreadyExistsException, GroupFullException { public void addMember(String target, User user) throws UserExistsException, GroupFullException {
ValidationHelper.throwIfMember(this, target); ValidationHelper.throwIfMember(this, target);
ValidationHelper.throwIfGroupFull(this); ValidationHelper.throwIfGroupFull(this);
@ -348,4 +348,8 @@ public class Group {
public static Group EMPTY() { public static Group EMPTY() {
return new Group(); return new Group();
} }
public long getVersion() {
return meta.getVersion();
}
} }

View File

@ -21,6 +21,9 @@ class GroupMeta {
if (this.version >= version) { if (this.version >= version) {
throw new IdMismatchException("Die Gruppe ist bereits auf einem neueren Stand."); throw new IdMismatchException("Die Gruppe ist bereits auf einem neueren Stand.");
} }
if (this.version + 1 != version) {
throw new IdMismatchException("Es fehlen vorherige Events.");
}
return new GroupMeta(version, creator, creationDate); return new GroupMeta(version, creator, creationDate);
} }

View File

@ -7,7 +7,7 @@ import mops.gruppen2.domain.exception.BadArgumentException;
import mops.gruppen2.domain.exception.GroupFullException; import mops.gruppen2.domain.exception.GroupFullException;
import mops.gruppen2.domain.exception.LastAdminException; import mops.gruppen2.domain.exception.LastAdminException;
import mops.gruppen2.domain.exception.NoAccessException; import mops.gruppen2.domain.exception.NoAccessException;
import mops.gruppen2.domain.exception.UserAlreadyExistsException; import mops.gruppen2.domain.exception.UserExistsException;
import mops.gruppen2.domain.exception.UserNotFoundException; import mops.gruppen2.domain.exception.UserNotFoundException;
import mops.gruppen2.domain.model.group.Group; import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.Type; import mops.gruppen2.domain.model.group.Type;
@ -39,10 +39,10 @@ public final class ValidationHelper {
// ######################################## THROW ############################################ // ######################################## THROW ############################################
public static void throwIfMember(Group group, String userid) throws UserAlreadyExistsException { public static void throwIfMember(Group group, String userid) throws UserExistsException {
if (group.isMember(userid)) { if (group.isMember(userid)) {
log.error("Benutzer {} ist schon in Gruppe {}", userid, group); log.error("Benutzer {} ist schon in Gruppe {}", userid, group);
throw new UserAlreadyExistsException(userid); throw new UserExistsException(userid);
} }
} }

View File

@ -1,17 +1,76 @@
package mops.gruppen2.domain.event; package mops.gruppen2.domain.event;
import mops.gruppen2.GroupBuilder;
import mops.gruppen2.TestHelper; import mops.gruppen2.TestHelper;
import mops.gruppen2.domain.exception.GroupFullException;
import mops.gruppen2.domain.exception.IdMismatchException; import mops.gruppen2.domain.exception.IdMismatchException;
import mops.gruppen2.domain.exception.UserExistsException;
import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.User; import mops.gruppen2.domain.model.group.User;
import mops.gruppen2.domain.service.EventStoreService;
import mops.gruppen2.infrastructure.GroupCache;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
class AddMemberEventTest { class AddMemberEventTest {
GroupCache cache;
@BeforeEach
void setUp() {
cache = new GroupCache(mock(EventStoreService.class));
}
@Test @Test
void userMismatch() { void userMismatch() {
assertThatThrownBy(() -> new AddMemberEvent(TestHelper.uuid(1), "TEST", "TEST", new User("PETER"))) assertThatThrownBy(() -> new AddMemberEvent(TestHelper.uuid(1), "TEST", "TEST", new User("PETER")))
.isInstanceOf(IdMismatchException.class); .isInstanceOf(IdMismatchException.class);
} }
@Test
void apply() {
Group group = GroupBuilder.get(cache, 1).group().build();
Event add = new AddMemberEvent(TestHelper.uuid(1), "TEST", "TEST", new User("TEST"));
add.init(2);
add.apply(group);
assertThat(group.getMembers()).containsExactly(new User("TEST"));
}
@Test
void apply_cache() {
Group group = GroupBuilder.get(cache, 1).group().build();
Event add = new AddMemberEvent(TestHelper.uuid(1), "TEST", "TEST", new User("TEST"));
add.init(2);
add.apply(group, cache);
assertThat(group.getMembers()).containsExactly(new User("TEST"));
assertThat(cache.userGroups("TEST")).containsExactly(group);
}
@Test
void apply_userExists() {
Group group = GroupBuilder.get(cache, 1).group().testadmin().limit(2).build();
Event add = new AddMemberEvent(TestHelper.uuid(1), "TEST", "TEST", new User("TEST"));
add.init(3);
assertThatThrownBy(() -> add.apply(group, cache))
.isInstanceOf(UserExistsException.class);
}
@Test
void apply_groupFull() {
Group group = GroupBuilder.get(cache, 1).group().testadmin().build();
Event add = new AddMemberEvent(TestHelper.uuid(1), "TEST", "PETER", new User("PETER"));
add.init(2);
assertThatThrownBy(() -> add.apply(group, cache))
.isInstanceOf(GroupFullException.class);
}
} }

View File

@ -0,0 +1,76 @@
package mops.gruppen2.domain.event;
import mops.gruppen2.GroupBuilder;
import mops.gruppen2.domain.exception.BadArgumentException;
import mops.gruppen2.domain.exception.IdMismatchException;
import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.User;
import mops.gruppen2.infrastructure.GroupCache;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static mops.gruppen2.TestHelper.uuid;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class EventTest {
@Test
void apply_smallVersion() {
Group group = GroupBuilder.get(Mockito.mock(GroupCache.class), 1).group().build();
Event add = new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST"));
add.init(1);
assertThatThrownBy(() -> add.apply(group))
.isInstanceOf(IdMismatchException.class);
}
@Test
void apply_bigVersion() {
Group group = GroupBuilder.get(Mockito.mock(GroupCache.class), 1).group().build();
Event add = new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST"));
add.init(3);
assertThatThrownBy(() -> add.apply(group))
.isInstanceOf(IdMismatchException.class);
}
@Test
void apply_notInitialized() {
Group group = GroupBuilder.get(Mockito.mock(GroupCache.class), 1).group().build();
Event add = new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST"));
assertThatThrownBy(() -> add.apply(group))
.isInstanceOf(BadArgumentException.class);
}
@Test
void apply_wrongGroup() {
Group group = GroupBuilder.get(Mockito.mock(GroupCache.class), 1).group().build();
Event add = new AddMemberEvent(uuid(2), "TEST", "TEST", new User("TEST"));
add.init(2);
assertThatThrownBy(() -> add.apply(group))
.isInstanceOf(IdMismatchException.class);
}
@Test
void apply_updateVersion() {
Group group = GroupBuilder.get(Mockito.mock(GroupCache.class), 1).group().build();
Event add = new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST"));
add.init(2);
assertThat(group.getVersion()).isEqualTo(1);
add.apply(group);
assertThat(group.getVersion()).isEqualTo(2);
}
@Test
void init_alreadyInitialized() {
Event add = new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST"));
add.init(2);
assertThatThrownBy(() -> add.init(3))
.isInstanceOf(BadArgumentException.class);
}
}

View File

@ -5,7 +5,7 @@ import mops.gruppen2.domain.exception.BadArgumentException;
import mops.gruppen2.domain.exception.GroupFullException; import mops.gruppen2.domain.exception.GroupFullException;
import mops.gruppen2.domain.exception.LastAdminException; import mops.gruppen2.domain.exception.LastAdminException;
import mops.gruppen2.domain.exception.NoAccessException; import mops.gruppen2.domain.exception.NoAccessException;
import mops.gruppen2.domain.exception.UserAlreadyExistsException; import mops.gruppen2.domain.exception.UserExistsException;
import mops.gruppen2.domain.exception.UserNotFoundException; import mops.gruppen2.domain.exception.UserNotFoundException;
import mops.gruppen2.domain.model.group.Group; import mops.gruppen2.domain.model.group.Group;
import mops.gruppen2.domain.model.group.Type; import mops.gruppen2.domain.model.group.Type;
@ -137,7 +137,7 @@ class GroupServiceTest {
Group group = GroupBuilder.get(mock(GroupCache.class), 1).group().testadmin().limit(3).add("PETER").build(); Group group = GroupBuilder.get(mock(GroupCache.class), 1).group().testadmin().limit(3).add("PETER").build();
assertThatThrownBy(() -> groupService.addMember(group, "Test", "PETER", new User("PETER"))) assertThatThrownBy(() -> groupService.addMember(group, "Test", "PETER", new User("PETER")))
.isInstanceOf(UserAlreadyExistsException.class); .isInstanceOf(UserExistsException.class);
} }
@Test @Test

View File

@ -14,6 +14,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -57,7 +58,11 @@ class ProjectionHelperTest {
new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()),
new CreateGroupEvent(uuid(5), "TEST", LocalDateTime.now())); new CreateGroupEvent(uuid(5), "TEST", LocalDateTime.now()));
initEvents(events); events.get(0).init(1);
events.get(1).init(1);
events.get(2).init(1);
events.get(3).init(1);
events.get(4).init(1);
assertThat(project(events)).hasSize(5); assertThat(project(events)).hasSize(5);
} }
@ -82,28 +87,40 @@ class ProjectionHelperTest {
@Test @Test
void project_nocache_multipleDetailed() { void project_nocache_multipleDetailed() {
List<Event> events = Arrays.asList( List<Event> eventsA = Arrays.asList(
new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now()),
new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST")), new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST")),
new UpdateRoleEvent(uuid(1), "TEST", "TEST", Role.ADMIN), new UpdateRoleEvent(uuid(1), "TEST", "TEST", Role.ADMIN),
new SetLimitEvent(uuid(1), "TEST", new Limit(5)), new SetLimitEvent(uuid(1), "TEST", new Limit(5)));
List<Event> eventsB = Arrays.asList(
new CreateGroupEvent(uuid(2), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(2), "TEST", LocalDateTime.now()),
new AddMemberEvent(uuid(2), "TEST", "TEST", new User("TEST")), new AddMemberEvent(uuid(2), "TEST", "TEST", new User("TEST")),
new UpdateRoleEvent(uuid(2), "TEST", "TEST", Role.ADMIN), new UpdateRoleEvent(uuid(2), "TEST", "TEST", Role.ADMIN),
new SetLimitEvent(uuid(2), "TEST", new Limit(15)), new SetLimitEvent(uuid(2), "TEST", new Limit(15)));
List<Event> eventsC = Arrays.asList(
new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()),
new AddMemberEvent(uuid(3), "TEST", "TEST", new User("TEST")), new AddMemberEvent(uuid(3), "TEST", "TEST", new User("TEST")),
new UpdateRoleEvent(uuid(3), "TEST", "TEST", Role.ADMIN), new UpdateRoleEvent(uuid(3), "TEST", "TEST", Role.ADMIN),
new SetLimitEvent(uuid(3), "TEST", new Limit(25)), new SetLimitEvent(uuid(3), "TEST", new Limit(25)));
List<Event> eventsD = Arrays.asList(
new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()),
new AddMemberEvent(uuid(4), "TEST", "TEST", new User("TEST")), new AddMemberEvent(uuid(4), "TEST", "TEST", new User("TEST")),
new UpdateRoleEvent(uuid(4), "TEST", "TEST", Role.ADMIN), new UpdateRoleEvent(uuid(4), "TEST", "TEST", Role.ADMIN),
new SetLimitEvent(uuid(4), "TEST", new Limit(35))); new SetLimitEvent(uuid(4), "TEST", new Limit(35)));
initEvents(events); initEvents(eventsA);
initEvents(eventsB);
initEvents(eventsC);
initEvents(eventsD);
List<Event> events = new ArrayList<>();
events.addAll(eventsA);
events.addAll(eventsB);
events.addAll(eventsC);
events.addAll(eventsD);
List<Group> groups = project(events); List<Group> groups = project(events);
@ -156,7 +173,10 @@ class ProjectionHelperTest {
new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()),
new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now())); new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()));
initEvents(events); events.get(0).init(1);
events.get(1).init(1);
events.get(2).init(1);
events.get(3).init(1);
project(groups, events, mock(GroupCache.class)); project(groups, events, mock(GroupCache.class));
assertThat(groups).hasSize(4); assertThat(groups).hasSize(4);
@ -166,28 +186,41 @@ class ProjectionHelperTest {
@Test @Test
void project_cache_multipleDetailed() { void project_cache_multipleDetailed() {
Map<UUID, Group> groups = new HashMap<>(); Map<UUID, Group> groups = new HashMap<>();
List<Event> events = Arrays.asList( List<Event> eventsA = Arrays.asList(
new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now()),
new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST")), new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST")),
new UpdateRoleEvent(uuid(1), "TEST", "TEST", Role.ADMIN), new UpdateRoleEvent(uuid(1), "TEST", "TEST", Role.ADMIN),
new SetLimitEvent(uuid(1), "TEST", new Limit(5)), new SetLimitEvent(uuid(1), "TEST", new Limit(5)));
List<Event> eventsB = Arrays.asList(
new CreateGroupEvent(uuid(2), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(2), "TEST", LocalDateTime.now()),
new AddMemberEvent(uuid(2), "TEST", "TEST", new User("TEST")), new AddMemberEvent(uuid(2), "TEST", "TEST", new User("TEST")),
new UpdateRoleEvent(uuid(2), "TEST", "TEST", Role.ADMIN), new UpdateRoleEvent(uuid(2), "TEST", "TEST", Role.ADMIN),
new SetLimitEvent(uuid(2), "TEST", new Limit(15)), new SetLimitEvent(uuid(2), "TEST", new Limit(15)));
List<Event> eventsC = Arrays.asList(
new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()),
new AddMemberEvent(uuid(3), "TEST", "TEST", new User("TEST")), new AddMemberEvent(uuid(3), "TEST", "TEST", new User("TEST")),
new UpdateRoleEvent(uuid(3), "TEST", "TEST", Role.ADMIN), new UpdateRoleEvent(uuid(3), "TEST", "TEST", Role.ADMIN),
new SetLimitEvent(uuid(3), "TEST", new Limit(25)), new SetLimitEvent(uuid(3), "TEST", new Limit(25)));
List<Event> eventsD = Arrays.asList(
new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()), new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()),
new AddMemberEvent(uuid(4), "TEST", "TEST", new User("TEST")), new AddMemberEvent(uuid(4), "TEST", "TEST", new User("TEST")),
new UpdateRoleEvent(uuid(4), "TEST", "TEST", Role.ADMIN), new UpdateRoleEvent(uuid(4), "TEST", "TEST", Role.ADMIN),
new SetLimitEvent(uuid(4), "TEST", new Limit(35))); new SetLimitEvent(uuid(4), "TEST", new Limit(35)));
initEvents(events); initEvents(eventsA);
initEvents(eventsB);
initEvents(eventsC);
initEvents(eventsD);
List<Event> events = new ArrayList<>();
events.addAll(eventsA);
events.addAll(eventsB);
events.addAll(eventsC);
events.addAll(eventsD);
project(groups, events, mock(GroupCache.class)); project(groups, events, mock(GroupCache.class));
assertThat(groups).hasSize(4); assertThat(groups).hasSize(4);

View File

@ -301,9 +301,9 @@ class GroupCacheTest {
@Test @Test
void linksRemove() { void linksRemove() {
Group group = GroupBuilder.get(cache, 1).group().testadmin().lecture().link(1).build(); Group group = GroupBuilder.get(cache, 1).group().testadmin().lecture().link(2).build();
assertThat(cache.group(String.valueOf(uuid(1)))).isEqualTo(group); assertThat(cache.group(String.valueOf(uuid(2)))).isEqualTo(group);
} }
//Indirekt: void typesPut() {} //Indirekt: void typesPut() {}