@Test
  public void isTradeOrSubstitutionAllowed() throws Exception {
    League league = leagueService.getLeague("ABSA Premier Soccer League");
    assertEquals(Long.valueOf(1), league.getId());
    LeagueSeason leagueSeason = leagueService.getCurrentSeason(league);
    assertEquals(Long.valueOf(1), leagueSeason.getId());
    Date date = new Date();

    // No fixtures
    assertTrue(fixtureService.isTradeOrSubstitutionAllowed(leagueSeason, date));

    // Current fixture
    Fixture fixture = saveFixtureForNow(leagueSeason, date);
    assertFalse(fixtureService.isTradeOrSubstitutionAllowed(leagueSeason, date));

    // Closest Fixture
    saveClosestFixture(fixture);
    assertFalse(fixtureService.isTradeOrSubstitutionAllowed(leagueSeason, date));

    // With a set feed date before the match end
    Date feedRun = savePastFeedDate(league, fixture.getEndDate());
    Calendar feed = Calendar.getInstance();
    feed.setTime(feedRun);
    feed.add(Calendar.MINUTE, 11); // after end of match and after the last time the feed has run
    date = feed.getTime();
    assertFalse(fixtureService.isTradeOrSubstitutionAllowed(leagueSeason, date));

    // No feed data
    resetFeedDate(league);
    feed = Calendar.getInstance();
    feed.setTime(feedRun);
    feed.add(Calendar.MINUTE, 11); // after end of match and no feed date
    date = feed.getTime();
    assertFalse(fixtureService.isTradeOrSubstitutionAllowed(leagueSeason, date));

    // With a set feed date after the match end
    feedRun = saveFutureFeedDate(league, fixture.getEndDate());
    feed = Calendar.getInstance();
    feed.setTime(feedRun);
    feed.add(Calendar.MINUTE, 10); // after match is over and feed has run
    date = feed.getTime();
    assertTrue(fixtureService.isTradeOrSubstitutionAllowed(leagueSeason, date));
  }