@Test
  public void shouldPutCoffeeStatusMessagesInQueue() {
    CoffeeStatus coffeeStatus1 = new CoffeeStatus();
    CoffeeStatus coffeeStatus2 = new CoffeeStatus();
    coffeeStatusProcessor.coffeeStatus(coffeeStatus1);
    coffeeStatusProcessor.coffeeStatus(coffeeStatus2);

    Assert.assertThat(coffeeStatusProcessor.getCoffeeStatusList().size(), is(2));
  }
  @Test
  public void shouldDoNothingWhenThereAreNoStatuses() throws Exception {
    HeartbeatEvent heartbeatEvent = new HeartbeatEvent();
    coffeeStatusProcessor.heartbeatEvent(heartbeatEvent);

    verify(mockHttpClient, times(0)).execute(Matchers.<HttpUriRequest>any());
  }
 @Test
 public void shouldNotClearStatusWhenIOExceptionThrown() throws Exception {
   try {
     when(mockHttpClient.execute(Matchers.<HttpUriRequest>any())).thenThrow(IOException.class);
     updateStatusAndPost(new CoffeeStatus());
     Assert.fail("No exception thrown");
   } catch (IOException e) {
     Assert.assertThat(coffeeStatusProcessor.getCoffeeStatusList().size(), is(1));
   }
 }
  @Test
  public void shouldUseOnlyLastCoffeeStatusForUpdates() throws Exception {
    CoffeeStatus coffeeStatus1 = new CoffeeStatus();
    CoffeeStatus coffeeStatus2 = new CoffeeStatus();
    coffeeStatus2.cupsRemaining = 999;
    coffeeStatus2.carafePresent = true;
    coffeeStatus2.lastBrewed = 888;

    coffeeStatusProcessor.coffeeStatus(coffeeStatus1);
    coffeeStatusProcessor.coffeeStatus(coffeeStatus2);

    HeartbeatEvent heartbeatEvent = new HeartbeatEvent();
    coffeeStatusProcessor.heartbeatEvent(heartbeatEvent);

    ArgumentCaptor<HttpPost> httpPostArgumentCaptor = ArgumentCaptor.forClass(HttpPost.class);

    verify(mockHttpClient, times(1)).execute(httpPostArgumentCaptor.capture());

    HttpPost httpPost = httpPostArgumentCaptor.getValue();
    String content = IOUtils.toString(httpPost.getEntity().getContent());

    String carafePresentString =
        coffeeStatusProcessor.getCarafePresentName()
            + "="
            + Boolean.toString(coffeeStatus2.carafePresent);
    String cupsRemainingString =
        coffeeStatusProcessor.getCupsRemainingName()
            + "="
            + String.valueOf(coffeeStatus2.cupsRemaining);
    String lastBrewedString =
        coffeeStatusProcessor.getLastBrewedName() + "=" + String.valueOf(coffeeStatus2.lastBrewed);

    Assert.assertThat(content, containsString(carafePresentString));
    Assert.assertThat(content, containsString(cupsRemainingString));
    Assert.assertThat(content, containsString(lastBrewedString));
  }
 private void updateStatusAndPost(CoffeeStatus coffeeStatus) throws Exception {
   coffeeStatusProcessor.coffeeStatus(coffeeStatus);
   Assert.assertThat(coffeeStatusProcessor.getCoffeeStatusList().size(), is(1));
   HeartbeatEvent heartbeatEvent = new HeartbeatEvent();
   coffeeStatusProcessor.heartbeatEvent(heartbeatEvent);
 }
  @Test
  public void shouldClearQueueAfterHeartbeat() throws Exception {
    updateStatusAndPost(new CoffeeStatus());

    Assert.assertThat(coffeeStatusProcessor.getCoffeeStatusList().size(), is(0));
  }