@Test
 public void testVerifyVotesRejectsMissingCategory() {
   assertFalse(1 == firstEvent.getVoteCategories().size());
   List<Long> voteList = Lists.newArrayList();
   voteList.add(firstEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
   try {
     voteService.verifyVotes(firstEvent, voteList);
     fail("should not succeed");
   } catch (Exception e) {
     assertTrue(e.getMessage().contains("Invalid voting"));
   }
 }
  @Test
  public void testVerifyVotesRejectsVotesForOtherEvent() {
    assertEquals(2, firstEvent.getVoteCategories().size());

    List<Long> voteList = Lists.newArrayList();
    voteList.add(firstEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    voteList.add(secondEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    try {
      voteService.verifyVotes(firstEvent, voteList);
      fail("should not succeed");
    } catch (Exception e) {
      assertTrue(e.getMessage().contains("Must vote in all categories"));
    }
  }
  @Test
  public void testVoteEventDoesntExist() {
    Event e = new Event(null, null, "", "", EventType.PUBLIC, DateTime.now(), DateTime.now());
    e.setId((long) 10000);

    List<Long> voteList = Lists.newArrayList();
    voteList.add((long) 1);
    try {
      voteService.verifyVotes(e, voteList);
      fail("should not succeed");
    } catch (Exception e1) {
      assertTrue(e1.getMessage() != null);
    }
  }
  @Test
  public void testVerifyAddVoteReplacesExistingVote() throws Exception {
    List<Long> voteList = Lists.newArrayList();
    voteList.add(firstEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    voteList.add(firstEvent.getVoteCategories().get(1).getVoteOptions().get(0).getId());
    voteService.addVotes(firstEvent, voteList, voter);
    // eventDao.update(firstEvent);

    VoteOption vo1o1 =
        voteOptionDao.find(firstEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    VoteOption vo2o1 =
        voteOptionDao.find(firstEvent.getVoteCategories().get(1).getVoteOptions().get(0).getId());

    assertTrue(vo1o1.getVotes().size() == 1);
    assertTrue(vo2o1.getVotes().size() == 1);

    voteList.clear();

    voteList.add(firstEvent.getVoteCategories().get(0).getVoteOptions().get(1).getId());
    voteList.add(firstEvent.getVoteCategories().get(1).getVoteOptions().get(1).getId());

    voteService.addVotes(firstEvent, voteList, voter);

    vo1o1 =
        voteOptionDao.find(firstEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    vo2o1 =
        voteOptionDao.find(firstEvent.getVoteCategories().get(1).getVoteOptions().get(0).getId());
    VoteOption vo1o2 =
        voteOptionDao.find(firstEvent.getVoteCategories().get(0).getVoteOptions().get(1).getId());
    VoteOption vo2o2 =
        voteOptionDao.find(firstEvent.getVoteCategories().get(1).getVoteOptions().get(1).getId());

    assertTrue(vo1o1.getVotes().size() == 0);
    assertTrue(vo2o1.getVotes().size() == 0);
    assertTrue(vo1o2.getVotes().size() == 1);
    assertTrue(vo2o2.getVotes().size() == 1);
  }
  @Test
  public void testVerifyVotes() {
    assertEquals(2, firstEvent.getVoteCategories().size());

    List<Long> voteList = Lists.newArrayList();
    voteList.add(firstEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    voteList.add(firstEvent.getVoteCategories().get(1).getVoteOptions().get(0).getId());

    try {
      voteService.verifyVotes(firstEvent, voteList);
      return;
    } catch (Exception e) {
      // ignore
    }
    fail("should not succeed");
  }
  @Test
  public void testRepeatCategoriesRejectsAll() {
    List<Long> voteList = Lists.newArrayList();
    // repeat all categories or one category
    voteList.add(firstEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    voteList.add(firstEvent.getVoteCategories().get(1).getVoteOptions().get(1).getId());
    voteList.add(firstEvent.getVoteCategories().get(0).getVoteOptions().get(1).getId());
    voteList.add(firstEvent.getVoteCategories().get(1).getVoteOptions().get(0).getId());

    try {
      voteService.addVotes(firstEvent, voteList, voter);
      fail("should not succeed");
    } catch (Exception e) {
      assertTrue(e.getMessage().contains("Invalid voting"));
    }
  }
  @Test
  public void testValidUserPrivateEvent() throws Exception {
    privateEvent.addEventUser(voter);

    List<Long> voteList = Lists.newArrayList();
    voteList.add(privateEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    voteList.add(privateEvent.getVoteCategories().get(1).getVoteOptions().get(1).getId());

    voteService.addVotes(privateEvent, voteList, voter);

    VoteOption vo1o1 =
        voteOptionDao.find(privateEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    VoteOption vo2o1 =
        voteOptionDao.find(privateEvent.getVoteCategories().get(1).getVoteOptions().get(1).getId());

    assertTrue(vo1o1.getVotes().size() == 1);
    assertTrue(vo2o1.getVotes().size() == 1);
  }
  @Test
  public void testVerifyAddVoteRecordsVote() throws Exception {
    // test firstEvent, secondEvent
    List<Long> voteList = Lists.newArrayList();
    voteList.add(firstEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    voteList.add(firstEvent.getVoteCategories().get(1).getVoteOptions().get(1).getId());
    voteService.addVotes(firstEvent, voteList, voter);

    // eventDao.update(secondEvent);

    VoteOption vo1o1 =
        voteOptionDao.find(firstEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
    VoteOption vo2o1 =
        voteOptionDao.find(firstEvent.getVoteCategories().get(1).getVoteOptions().get(1).getId());

    assertTrue(vo1o1.getVotes().size() == 1);
    assertTrue(vo2o1.getVotes().size() == 1);
  }
  @Test
  public void testInvalidUserPrivateEvent() throws Exception {

    try {
      List<Long> voteList = Lists.newArrayList();
      voteList.add(privateEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
      voteList.add(privateEvent.getVoteCategories().get(1).getVoteOptions().get(1).getId());

      voteService.addVotes(privateEvent, voteList, voter);

      VoteOption vo1o1 =
          voteOptionDao.find(
              privateEvent.getVoteCategories().get(0).getVoteOptions().get(0).getId());
      VoteOption vo2o1 =
          voteOptionDao.find(
              privateEvent.getVoteCategories().get(1).getVoteOptions().get(1).getId());

      assertTrue(vo1o1.getVotes().size() == 1);
      assertTrue(vo2o1.getVotes().size() == 1);

    } catch (Exception e) {
      assertTrue(e.getMessage().contains("Invalid event for user"));
    }
  }