Skip to content

Commit

Permalink
made Chicken an enum
Browse files Browse the repository at this point in the history
  • Loading branch information
StephanSST committed Mar 18, 2024
1 parent 197aca0 commit 841da37
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 81 deletions.
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ This code will run on a Raspberry PI in a chicken barn. There are scales under t

### Epic v1: Chicken scale recognizes weight change and sends message about state (which chicken, an egg) via Messenger

* make ChickenService.initBoxes() resiliant for new Chickens (convert to enum, initBoxes using enum list)
* check logs; observer and service log twice
* log messures to file or Prometheus
* write tests and mocks for mqtt client
Expand Down
27 changes: 22 additions & 5 deletions src/main/java/ch/stephan/chickenfarm/dto/Chicken.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,25 @@
package ch.stephan.chickenfarm.dto;

public record Chicken(String name, int weight) {
public static final Chicken HEIDI = new Chicken("Heidi", 2200);
public static final Chicken KLARA = new Chicken("Klara", 2850);
public static final Chicken LILI = new Chicken("Lili", 2851);
public static final Chicken LULU = new Chicken("Lulu", 3450);
public enum Chicken {
HEIDI("Heidi", 2200), //
KLARA("Klara", 2850), //
LILI("Lili", 2851), //
LULU("Lulu", 3450);

private String name;
private int weight;

private Chicken(String name, int weight) {
this.name = name;
this.weight = weight;
}

public String getName() {
return name;
}

public int getWeight() {
return weight;
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ch.stephan.chickenfarm.registry;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.stereotype.Service;
Expand All @@ -23,7 +23,7 @@ public Chicken guessChicken(int weight) {
}

private Chicken betterMatching(Chicken chicken, Chicken another, int weight) {
if (Math.abs(weight - chicken.weight()) <= Math.abs(weight - another.weight())) {
if (Math.abs(weight - chicken.getWeight()) <= Math.abs(weight - another.getWeight())) {
return chicken;
} else {
return another;
Expand All @@ -32,11 +32,7 @@ private Chicken betterMatching(Chicken chicken, Chicken another, int weight) {

@PostConstruct
public void initBoxes() {
sChickens = new ArrayList<>();
sChickens.add(Chicken.HEIDI);
sChickens.add(Chicken.KLARA);
sChickens.add(Chicken.LILI);
sChickens.add(Chicken.LULU);
sChickens = Arrays.asList(Chicken.values());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,39 +19,39 @@ private void setup() {

@Test
void testEqualWeight() {
Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.weight());
Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.getWeight());
assertEquals(Chicken.HEIDI, chicken);

chicken = chickenService.guessChicken(Chicken.KLARA.weight());
chicken = chickenService.guessChicken(Chicken.KLARA.getWeight());
assertEquals(Chicken.KLARA, chicken);

chicken = chickenService.guessChicken(Chicken.LILI.weight());
chicken = chickenService.guessChicken(Chicken.LILI.getWeight());
assertEquals(Chicken.LILI, chicken);

chicken = chickenService.guessChicken(Chicken.LULU.weight());
chicken = chickenService.guessChicken(Chicken.LULU.getWeight());
assertEquals(Chicken.LULU, chicken);
}

@Test
void testTenGrammLighter() {
Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.weight() - 10);
Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.getWeight() - 10);
assertEquals(Chicken.HEIDI, chicken);

chicken = chickenService.guessChicken(Chicken.KLARA.weight() - 10);
chicken = chickenService.guessChicken(Chicken.KLARA.getWeight() - 10);
assertEquals(Chicken.KLARA, chicken);

chicken = chickenService.guessChicken(Chicken.LULU.weight() - 10);
chicken = chickenService.guessChicken(Chicken.LULU.getWeight() - 10);
assertEquals(Chicken.LULU, chicken);
}

@Test
void testTenGrammHeavier() {
Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.weight() + 10);
Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.getWeight() + 10);
assertEquals(Chicken.HEIDI, chicken);
chicken = chickenService.guessChicken(Chicken.LILI.weight() + 10);
chicken = chickenService.guessChicken(Chicken.LILI.getWeight() + 10);
assertEquals(Chicken.LILI, chicken);

chicken = chickenService.guessChicken(Chicken.LULU.weight() + 10);
chicken = chickenService.guessChicken(Chicken.LULU.getWeight() + 10);
assertEquals(Chicken.LULU, chicken);

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ class MeasureControllerTest {

@Test
void testMeasure() throws Exception {
when(scaleService.measureWeight(eq(BOX1.getId()))).thenReturn(CHICKEN1.weight());
when(scaleService.measureWeight(eq(BOX2.getId()))).thenReturn(CHICKEN2.weight());
when(scaleService.measureWeight(eq(BOX1.getId()))).thenReturn(CHICKEN1.getWeight());
when(scaleService.measureWeight(eq(BOX2.getId()))).thenReturn(CHICKEN2.getWeight());

String mockMvcResult = mockMvc.perform(get("/measure").contentType(MediaType.APPLICATION_JSON))//
.andExpect(status().isOk())//
Expand All @@ -69,11 +69,11 @@ void testMeasure() throws Exception {
assertThat(measures).hasSize(2);
assertThat(measures.get(0).boxId()).isEqualTo(BOX1.getId());
assertThat(measures.get(0).boxDescription()).isEqualTo(BOX1.getDescription());
assertThat(measures.get(0).currentWeight()).isEqualTo(CHICKEN1.weight());
assertThat(measures.get(0).currentWeight()).isEqualTo(CHICKEN1.getWeight());
assertThat(measures.get(0).currentChicken()).isEqualTo(CHICKEN1.name());
assertThat(measures.get(1).boxId()).isEqualTo(BOX2.getId());
assertThat(measures.get(1).boxDescription()).isEqualTo(BOX2.getDescription());
assertThat(measures.get(1).currentWeight()).isEqualTo(CHICKEN2.weight());
assertThat(measures.get(1).currentWeight()).isEqualTo(CHICKEN2.getWeight());
assertThat(measures.get(1).currentChicken()).isEqualTo(CHICKEN2.name());
}

Expand Down
110 changes: 56 additions & 54 deletions src/test/java/ch/stephan/chickenfarm/timer/ScaleObserverTest.java
Original file line number Diff line number Diff line change
@@ -1,88 +1,90 @@
package ch.stephan.chickenfarm.timer;

import ch.stephan.chickenfarm.dto.Box;
import ch.stephan.chickenfarm.dto.Chicken;
import ch.stephan.chickenfarm.messenger.MessengerService;
import ch.stephan.chickenfarm.registry.BoxService;
import ch.stephan.chickenfarm.registry.ChickenService;
import ch.stephan.chickenfarm.scale.ScaleService;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;

import ch.stephan.chickenfarm.dto.Box;
import ch.stephan.chickenfarm.dto.Chicken;
import ch.stephan.chickenfarm.messenger.MessengerService;
import ch.stephan.chickenfarm.registry.BoxService;
import ch.stephan.chickenfarm.registry.ChickenService;
import ch.stephan.chickenfarm.scale.ScaleService;

@ExtendWith(MockitoExtension.class)
class ScaleObserverTest {

private ScaleObserver scaleObserver;
private ScaleObserver scaleObserver;

@InjectMocks
private BoxService boxService;

@Mock
private ScaleService mockedScaleService;

@InjectMocks
private BoxService boxService;
@Mock
private MessengerService mockMessengerService;

@Mock
private ScaleService mockedScaleService;
@InjectMocks
private ChickenService chickenService;

@Mock
private MessengerService mockMessengerService;
@BeforeEach
void setUp() throws Exception {
boxService.initBoxes();
chickenService.initBoxes();

@InjectMocks
private ChickenService chickenService;
scaleObserver = new ScaleObserver(boxService, mockedScaleService, mockMessengerService, chickenService);
}

@BeforeEach
void setUp() throws Exception {
boxService.initBoxes();
chickenService.initBoxes();
@Test
void testMeasureWeights() {
// Step 1: Two chickens are in the house
Box vorne = Box.VORNE;
Box hinten = Box.HINTEN;
Chicken heidi = Chicken.HEIDI;
Chicken klara = Chicken.KLARA;

scaleObserver = new ScaleObserver(boxService, mockedScaleService, mockMessengerService, chickenService);
}
Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(klara.getWeight() + 13);
Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(heidi.getWeight() + 17);

@Test
void testMeasureWeights() {
// Step 1: Two chickens are in the house
Box vorne = Box.VORNE;
Box hinten = Box.HINTEN;
Chicken heidi = Chicken.HEIDI;
Chicken klara = Chicken.KLARA;
scaleObserver.measureWeights();

Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(klara.weight() + 13);
Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(heidi.weight() + 17);
Mockito.verify(mockMessengerService, times(2)).sendNotification(anyString());

scaleObserver.measureWeights();
// measure again, no new message
scaleObserver.measureWeights();

Mockito.verify(mockMessengerService, times(2)).sendNotification(anyString());
Mockito.verify(mockMessengerService, times(2)).sendNotification(anyString());

// measure again, no new message
scaleObserver.measureWeights();
// Step 2: Chickens laid eggs and left the house
Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(67);
Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(64);

Mockito.verify(mockMessengerService, times(2)).sendNotification(anyString());
scaleObserver.measureWeights();

// Step 2: Chickens laid eggs and left the house
Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(67);
Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(64);
Mockito.verify(mockMessengerService, times(4)).sendNotification(anyString());

scaleObserver.measureWeights();
// measure again, no new message
scaleObserver.measureWeights();

Mockito.verify(mockMessengerService, times(4)).sendNotification(anyString());
Mockito.verify(mockMessengerService, times(4)).sendNotification(anyString());

// measure again, no new message
scaleObserver.measureWeights();

Mockito.verify(mockMessengerService, times(4)).sendNotification(anyString());

// Step 3: Pamela removed the eggs
Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(2);
Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(-3);
// Step 3: Pamela removed the eggs
Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(2);
Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(-3);

scaleObserver.measureWeights();
scaleObserver.measureWeights();

Mockito.verify(mockMessengerService, times(6)).sendNotification(anyString());
Mockito.verify(mockMessengerService, times(6)).sendNotification(anyString());

}
}

}

0 comments on commit 841da37

Please sign in to comment.