package de.flower.rmt.test; import de.flower.common.util.Check; import de.flower.common.util.geo.LatLng; import de.flower.rmt.model.db.entity.Activity; import de.flower.rmt.model.db.entity.BArticle; import de.flower.rmt.model.db.entity.BComment; import de.flower.rmt.model.db.entity.CalItem; import de.flower.rmt.model.db.entity.Club; import de.flower.rmt.model.db.entity.Comment; import de.flower.rmt.model.db.entity.Invitation; import de.flower.rmt.model.db.entity.Lineup; import de.flower.rmt.model.db.entity.LineupItem; import de.flower.rmt.model.db.entity.Player; import de.flower.rmt.model.db.entity.Role; import de.flower.rmt.model.db.entity.Team; import de.flower.rmt.model.db.entity.Uniform; import de.flower.rmt.model.db.entity.User; import de.flower.rmt.model.db.entity.Venue; import de.flower.rmt.model.db.entity.event.AbstractSoccerEvent; import de.flower.rmt.model.db.entity.event.Event; import de.flower.rmt.model.db.entity.event.Event_; import de.flower.rmt.model.db.entity.event.Match; import de.flower.rmt.model.db.type.EventType; import de.flower.rmt.model.db.type.RSVPStatus; import de.flower.rmt.model.dto.CalItemDto; import de.flower.rmt.repository.IActivityRepo; import de.flower.rmt.repository.IClubRepo; import de.flower.rmt.repository.IEventRepo; import de.flower.rmt.repository.IPlayerRepo; import de.flower.rmt.repository.ITeamRepo; import de.flower.rmt.service.IActivityManager; import de.flower.rmt.service.IBlogManager; import de.flower.rmt.service.ICommentManager; import de.flower.rmt.service.IEventManager; import de.flower.rmt.service.IInvitationManager; import de.flower.rmt.service.ILineupManager; import de.flower.rmt.service.IOpponentManager; import de.flower.rmt.service.IPlayerManager; import de.flower.rmt.service.ITeamManager; import de.flower.rmt.service.IUniformManager; import de.flower.rmt.service.IUserManager; import de.flower.rmt.service.IVenueManager; import org.apache.commons.lang.math.RandomUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.Validate; import org.joda.time.DateTime; import org.joda.time.LocalTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Random; import java.util.concurrent.TimeUnit; /** * Provides test data. * <p/> * Use #newXXX methods in unit tests. * Use #getXXX methods when running integration tests with underlying database. * * @author flowerrrr */ @Service @Transactional(propagation = Propagation.REQUIRED) public class TestData { private final static Logger log = LoggerFactory.getLogger(TestData.class); @Autowired private ITeamRepo teamRepo; @Autowired private IClubRepo clubRepo; @Autowired private IEventRepo eventRepo; @Autowired private IPlayerRepo playerRepo; @Autowired private IActivityRepo activityRepo; @Autowired private ITeamManager teamManager; @Autowired private IUniformManager uniformManager; @Autowired private IPlayerManager playerManager; @Autowired private IEventManager eventManager; @Autowired private ILineupManager lineupManager; @Autowired protected IInvitationManager invitationManager; @Autowired protected ICommentManager commentManager; @Autowired private IVenueManager venueManager; @Autowired private IOpponentManager opponentManager; @Autowired private IUserManager userManager; @Autowired private IBlogManager blogManager; @Autowired private IActivityManager activityManager; private Random random = new Random(); /** * Determines type of created test event. */ private EventType eventType = EventType.Training; public TestData() { // interesting, constructor called twice. // see http://forum.springsource.org/showthread.php?9814-Constructor-called-twice-when-using-CGLIB-proxy-beans // log.info("TestData.<init>"); } public void setEventType(final EventType eventType) { this.eventType = eventType; } public Club getClub() { // load some often used entities return Validate.notNull(clubRepo.findOne(1L)); } public Club newClub() { Club club = new Club("Foo FC"); return club; } public Team getJuveAmateure() { return Validate.notNull(teamRepo.findOne(1L)); } public Team createTeam(String name) { Team team = teamManager.newInstance(); team.setName(name); teamManager.save(team); return team; } public Team createTeamWithPlayers(String name, int numPlayers) { Team team = createTeam(name); List<User> users = createUsers(numPlayers - 1); playerManager.addPlayers(team, users); // add user of security context to team playerManager.addPlayer(team, getTestUser()); return team; } public Team newTeamWithPlayers(int numPlayers) { Team team = newTeam(); List<User> users = newUsers(numPlayers); for (User user : users) { addPlayer(team, user); } return team; } public Team newTeam() { Team team = new Team(newClub()); team.setName("Amateure"); return team; } public User newUser() { User user = new User(newClub()); user.setEmail(RandomStringUtils.randomAlphabetic(8) + "@acme.com"); user.setPhoneNumber("+49-189-8234238"); user.setFullname(RandomStringUtils.randomAlphabetic(10)); user.setInitialPassword("1234"); user.setEncryptedPassword("io8ujalöjdfkalsöj"); user.setStatus(random.nextBoolean() ? User.Status.FIT : User.Status.INJURED); Role role = new Role(Role.Roles.PLAYER.getRoleName()); user.getRoles().add(role); role.setUser(user); // some get manager role if (random.nextBoolean()) { role = new Role(Role.Roles.MANAGER.getRoleName()); user.getRoles().add(role); role.setUser(user); } return user; } public User newUserWithTeams() { Club club = newClub(); Team team1 = new Team(club); Team team2 = new Team(club); Team team3 = new Team(club); User user = newUser(); // add user to teams addPlayer(team1, user); addPlayer(team2, user); addPlayer(team3, user); return user; } private Player addPlayer(final Team team, final User user) { Player player = new Player(team, user); player.setRetired(false); player.setOptional(false); player.setNotification(true); team.getPlayers().add(player); user.getPlayers().add(player); return player; } public User createUser() { return createUsers(1).get(0); } public List<User> createUsers(int count) { List<User> users = new ArrayList<User>(); for (int i = 0; i < count; i++) { User user = userManager.newInstance(); user.setEmail(RandomStringUtils.randomAlphabetic(8) + "@mailinator.com"); user.setFullname(RandomStringUtils.randomAlphabetic(10)); userManager.save(user); users.add(user); } return users; } public List<User> newUsers(int count) { List<User> users = new ArrayList<User>(); for (int i = 0; i < count; i++) { User user = newUser(); users.add(user); } return users; } public Event newEvent() { Team team = newTeamWithPlayers(15); Event event = eventType.newInstance(team.getClub()); event.setTeam(team); // pick first player as manager who created this event. event.setCreatedBy(team.getPlayers().get(0).getUser()); event.setDateTime(new DateTime()); if (EventType.isSoccerEvent(event)) { ((AbstractSoccerEvent) event).setKickoff(new LocalTime()); ((AbstractSoccerEvent) event).setUniform(newUniformList(event.getTeam()).get(0)); } event.setVenue(newVenue(event.getTeam().getClub())); event.setSummary("2. Training"); event.setComment("Kommt ja nicht zu spät!"); for (Player player : event.getTeam().getPlayers()) { // create invitations Invitation invitation = new Invitation(event, player.getUser()); event.getInvitations().add(invitation); } return event; } public Event createEvent(Team team, boolean createInvitations) { Event event = eventManager.newInstance(eventType); // use some time in the future event.setDateTime(new DateTime().plusHours(RandomUtils.nextInt(1000))); event.setSummary("Summary"); event.setTeam(team); event.setVenue(venueManager.loadById(1L)); if (EventType.isSoccerEvent(event)) { ((AbstractSoccerEvent) event).setKickoff(LocalTime.now()); ((AbstractSoccerEvent) event).setUniform(createUniformList(team).get(0)); } if (EventType.isMatch(event)) { ((Match) event).setOpponent(opponentManager.loadById(1L)); } eventManager.create(event, createInvitations); return eventManager.loadById(event.getId(), Event_.team/*, Event_.invitations - does not work because of subclassing issues */); } public Event createEvent() { Team team = createTeamWithPlayers("FCB " + System.currentTimeMillis(), 15); Event event = createEvent(team, true); return event; } public List<Event> createEventsWithInvitations(final Team team, final int number, boolean past) { List<Event> list = new ArrayList<>(); for (int i = 0; i < number; i++) { Event event = createEvent(team, true); // events are in the future by default if (past) { event.setDateTime(new DateTime().minusHours(RandomUtils.nextInt(1000))); } eventManager.save(event); list.add(event); } return list; } /** * Creates an event with some responses. */ public Event createEventWithResponses() { Event event = createEvent(); List<Invitation> invitations = invitationManager.findAllByEvent(event); respond(invitations.get(0), RSVPStatus.ACCEPTED, "some comment"); respond(invitations.get(2), RSVPStatus.DECLINED, "some comment"); respond(invitations.get(3), RSVPStatus.ACCEPTED, "some comment"); respond(invitations.get(5), RSVPStatus.UNSURE, "some comment"); respond(invitations.get(7), RSVPStatus.ACCEPTED, "some comment"); respond(invitations.get(8), RSVPStatus.DECLINED, "some comment"); respond(invitations.get(9), RSVPStatus.DECLINED, "some comment"); respond(invitations.get(11), RSVPStatus.ACCEPTED, "some comment"); respond(invitations.get(12), RSVPStatus.ACCEPTED, "some comment"); // test multi-comment comments Comment comment = new Comment("some other comment", invitations.get(0), invitations.get(1).getUser()); commentManager.save(comment); comment = new Comment("manager has to say something", invitations.get(0), event.getCreatedBy()); commentManager.save(comment); // init collections event.getTeam().getPlayers().size(); event.getTeam().getPlayers().get(0).getUser(); return event; } public Lineup newLineup(Event event) { Lineup lineup = new Lineup(event); lineup.setName("Lineup #" + RandomUtils.nextInt(100)); for (Invitation invitation : event.getInvitations()) { LineupItem item = new LineupItem(lineup, invitation); item.setTop(Long.valueOf(RandomUtils.nextInt(500))); item.setLeft(Long.valueOf(RandomUtils.nextInt(400))); lineup.getItems().add(item); } return lineup; } public Lineup createLineup(Event event) { Lineup lineup = lineupManager.findOrCreateLineup(event); Check.notNull(lineup); List<Invitation> accepted = invitationManager.findAllByEventAndStatus(event, RSVPStatus.ACCEPTED); Check.notEmpty(accepted); for (Invitation invitation : accepted) { LineupItem item = new LineupItem(lineup, invitation); item.setTop(Long.valueOf(RandomUtils.nextInt(500))); item.setLeft(Long.valueOf(RandomUtils.nextInt(400))); lineup.getItems().add(item); lineupManager.save(item); } return lineup; } private void respond(Invitation invitation, RSVPStatus status, String comment) { invitation.setStatus(status); invitationManager.save(invitation, comment); } public User getTestUser() { return userManager.findByUsername(AbstractRMTIntegrationTests.testUserName); } public Venue newVenue(Club club) { Venue venue = new Venue(club); venue.setName("Böglwiese"); venue.setAddress("Putzbrunner Str. 13\n81739 München"); venue.setLatLng(new LatLng(48.12123, 11.01231231)); return venue; } public Venue createVenue(Club club) { Venue venue = newVenue(club); venueManager.save(venue); return venue; } public List<Uniform> createUniformList(Team team) { List<Uniform> uniforms = newUniformList(team); for (Uniform uniform : uniforms) { uniformManager.save(uniform); } return uniformManager.findAllByTeam(team); } public List<Uniform> newUniformList(Team team) { Uniform j1 = new Uniform(team); j1.setName("Trikotsatz 1"); j1.setShirt("white/red stripes"); j1.setShorts("red"); j1.setSocks("white"); Uniform j2 = new Uniform(team); j2.setName("Trikotsatz 2"); j2.setShirt("black"); j2.setShorts("red"); j2.setSocks("gold"); return Arrays.asList(j1, j2); } public List<Activity> newActivities(final int num) { Club club = newClub(); List<Activity> list = new ArrayList<>(); for (int i = 0; i < num; i++) { Activity entity = new Activity(club); entity.setDate(new DateTime().minusMillis(RandomUtils.nextInt((int) TimeUnit.DAYS.toMillis(10))).toDate()); entity.setMessage("Some message " + RandomStringUtils.randomAscii(20)); list.add(entity); } // sort desc by date Collections.sort(list, new Comparator<Activity>() { @Override public int compare(final Activity o1, final Activity o2) { return (int) (o2.getDate().getTime() - o1.getDate().getTime()); } }); return list; } public void createActivities(final int num) { Club club = getClub(); for (int i = 0; i < num; i++) { Activity entity = new Activity(club); entity.setDate(new DateTime().minusMillis(RandomUtils.nextInt((int) TimeUnit.DAYS.toMillis(10))).toDate()); entity.setMessage("Some message " + RandomStringUtils.randomAscii(20)); activityRepo.save(entity); } } public CalItem newCalItem() { CalItem entity = new CalItem(); entity.setStartDateTime(new DateTime().withTime(2, 15, 0, 0)); entity.setEndDateTime(new DateTime().withTime(22, 30, 0, 0)); entity.setSummary("summary"); entity.setType(CalItem.Type.OTHER); entity.setUser(new User(new Club("new club"))); return entity; } public CalItemDto newCalItemDto() { return CalItemDto.fromEntity(newCalItem()); } /** * Method replaces dbUnit xml file. Seems to have more advantages to use programmatic approach. */ // public void insertTestData() { // Club juve = createClub("Juventus Urin", 48.13724243994332, 11.575392225925508); // Club fcb = createClub("FC Bayern", 48.13724243994332, 11.575392225925508); // // createProperty(juve, "uservoice.token", "mNTsoCUuSEaF5qjGfDGIuQ"); // // User user1 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "admin-rmt@mailinator.com", "Flowerrr", juve); // User user2 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "manager-rmt@mailinator.com", "Sepp", juve); // User user3 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player-rmt@mailinator.com", "Ingo", juve); // User user4 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "both-rmt@mailinator.com", "Maik", juve); // User user5 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "bayern-rmt@mailinator.com", "Uli Hoeneß", juve); // User user6 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player1-rmt@mailinator.com", "Hansi", juve); // User user7 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player2-rmt@mailinator.com", "Horst", juve); // User user8 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player3-rmt@mailinator.com", "Thorsten", juve); // User user9 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player4-rmt@mailinator.com", "Michi", juve); // User user10 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player5-rmt@mailinator.com", "Paul", juve); // User user11 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player6-rmt@mailinator.com", "Hugo", juve); // User user12 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player7-rmt@mailinator.com", "Alder", juve); // User user13 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player8-rmt@mailinator.com", "Dragan", juve); // User user14 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player9-rmt@mailinator.com", "Stefan", juve); // User user15 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player10-rmt@mailinator.com", "Erkan", juve); // User user16 = createUser("81dc9bdb52d04dc20036dbd8313ed055", "1234", "player11-rmt@mailinator.com", "Süpür", juve); // } public void createBlogArticles(int num) { for (int i = 0; i < num; i++) { List<User> authors = userManager.findAll(); User author = authors.get(RandomUtils.nextInt(authors.size())); createBlogArticle(author, true); } } public BArticle createBlogArticle(User author, final boolean createComments) { BArticle article = blogManager.newArticle(author); article.setHeading("Some random heading " + RandomStringUtils.randomAlphabetic(4)); article.setText(RandomStringUtils.randomAlphabetic(RandomUtils.nextInt(8000))); blogManager.save(article); if (createComments) { List<User> authors = userManager.findAll(); for (int i = 0; i < RandomUtils.nextInt(30); i++) { author = authors.get(RandomUtils.nextInt(authors.size())); BComment comment = blogManager.newComment(article, author); comment.setText(RandomStringUtils.randomAlphabetic(RandomUtils.nextInt(BComment.MAXLENGTH))); blogManager.save(comment); } } return article; } }