-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathCirculationDeskTest.java
More file actions
154 lines (120 loc) · 6.27 KB
/
CirculationDeskTest.java
File metadata and controls
154 lines (120 loc) · 6.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package example.borrow;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.time.LocalDate;
import java.util.Optional;
import example.borrow.application.CirculationDesk;
import example.borrow.domain.Book;
import example.borrow.domain.BookRepository;
import example.borrow.domain.Hold;
import example.borrow.domain.Hold.BookCheckedOut;
import example.borrow.domain.Hold.BookPlacedOnHold;
import example.borrow.domain.HoldRepository;
import example.borrow.domain.Patron.PatronId;
import static example.borrow.domain.Book.BookStatus.ISSUED;
import static example.borrow.domain.Book.BookStatus.ON_HOLD;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class CirculationDeskTest {
CirculationDesk circulationDesk;
@Mock
BookRepository bookRepository;
@Mock
HoldRepository holdRepository;
@BeforeEach
void setUp() {
circulationDesk = new CirculationDesk(bookRepository, holdRepository);
}
@Test
void patronCanPlaceHold() {
var command = new Hold.PlaceHold(new Book.Barcode("12345"), LocalDate.now(), new PatronId("john.wick@continental.com"));
var book = Book.addBook(new Book.AddBook(new Book.Barcode("12345"), "Test Book", "1234567890"));
var hold = Hold.placeHold(command);
when(bookRepository.findAvailableBook(any())).thenReturn(Optional.of(book));
when(holdRepository.save(any())).thenReturn(hold);
var holdDto = circulationDesk.placeHold(command);
assertThat(holdDto.getBookBarcode()).isEqualTo("12345");
assertThat(holdDto.getDateOfHold()).isNotNull();
}
@Test
void bookStatusUpdatedWhenPlacedOnHold() {
var command = new Hold.PlaceHold(new Book.Barcode("12345"), LocalDate.now(), new PatronId("john.wick@continental.com"));
var hold = Hold.placeHold(command);
var book = Book.addBook(new Book.AddBook(new Book.Barcode("12345"), "Test Book", "1234567890"));
when(bookRepository.findAvailableBook(any())).thenReturn(Optional.of(book));
when(bookRepository.save(any())).thenReturn(book);
circulationDesk.handle(new BookPlacedOnHold(hold.getId().id(), hold.getOnBook().barcode(), hold.getDateOfHold()));
assertThat(book.getStatus()).isEqualTo(ON_HOLD);
}
@Test
void patronCanCheckoutBook() {
var patronId = new PatronId("john.wick@continental.com");
var hold = Hold.placeHold(new Hold.PlaceHold(new Book.Barcode("12345"), LocalDate.now(), patronId));
var command = new Hold.Checkout(hold.getId(), LocalDate.now(), patronId);
when(holdRepository.findById(any())).thenReturn(Optional.of(hold));
when(holdRepository.save(any())).thenReturn(hold);
var holdInformation = circulationDesk.checkout(command);
assertThat(holdInformation.getId()).isEqualTo(hold.getId().id().toString());
assertThat(holdInformation.getDateOfCheckout()).isNotNull();
}
@Test
void patronCannotCheckoutBookHeldBySomeoneElse() {
var hold = Hold.placeHold(new Hold.PlaceHold(new Book.Barcode("12345"), LocalDate.now(), new PatronId("john.wick@continental.com")));
var command = new Hold.Checkout(hold.getId(), LocalDate.now(), new PatronId("winston@continental.com"));
when(holdRepository.findById(any())).thenReturn(Optional.of(hold));
assertThatIllegalArgumentException() //
.isThrownBy(() -> circulationDesk.checkout(command)) //
.withMessage("Hold belongs to a different patron");
}
@Test
void bookStatusUpdatedWhenCheckoutBook() {
// Arrange
Book book = Book.addBook(new Book.AddBook(new Book.Barcode("12345"), "Test Book", "1234567890"));
book.markOnHold();
when(bookRepository.findOnHoldBook(any())).thenReturn(Optional.of(book));
when(bookRepository.save(any())).thenReturn(book);
Hold.BookCheckedOut event = new BookCheckedOut(book.getId().id(), book.getInventoryNumber().barcode(), LocalDate.now());
// Act
circulationDesk.handle(event);
// Assert
assertThat(book.getStatus()).isEqualTo(ISSUED);
}
@Test
void patronCanCheckinBook() {
// Arrange
var patronId = new PatronId("john.wick@continental.com");
var book = Book.addBook(new Book.AddBook(new Book.Barcode("12345"), "Test Book", "1234567890"));
var hold = Hold.placeHold(new Hold.PlaceHold(book.getInventoryNumber(), LocalDate.now(), patronId));
hold.checkout(new Hold.Checkout(hold.getId(), LocalDate.now(), patronId));
var checkinCommand = new Hold.Checkin(hold.getId(), LocalDate.now(), patronId);
when(holdRepository.findById(hold.getId())).thenReturn(Optional.of(hold));
when(holdRepository.save(any())).thenReturn(hold);
// Act
var holdInformation = circulationDesk.checkin(checkinCommand);
// Assert
assertThat(holdInformation.getId()).isEqualTo(hold.getId().id().toString());
assertThat(holdInformation.getDateOfCheckin()).isNotNull();
assertThat(hold.getStatus()).isEqualTo(Hold.HoldStatus.RETURNED);
}
@Test
void patronCannotCheckinBookHeldBySomeoneElse() {
// Arrange
var patronId = new PatronId("john.wick@continental.com");
var otherPatronId = new PatronId("winston@continental.com");
var book = Book.addBook(new Book.AddBook(new Book.Barcode("12345"), "Test Book", "1234567890"));
var hold = Hold.placeHold(new Hold.PlaceHold(book.getInventoryNumber(), LocalDate.now(), patronId));
hold.checkout(new Hold.Checkout(hold.getId(), LocalDate.now(), patronId));
var checkinCommand = new Hold.Checkin(hold.getId(), LocalDate.now(), otherPatronId);
when(holdRepository.findById(hold.getId())).thenReturn(Optional.of(hold));
// Act & Assert
assertThatIllegalArgumentException()
.isThrownBy(() -> circulationDesk.checkin(checkinCommand))
.withMessage("Hold belongs to a different patron");
}
}