-
Notifications
You must be signed in to change notification settings - Fork 16
/
InvoiceDaoIntegrationTest.java
89 lines (73 loc) · 2.85 KB
/
InvoiceDaoIntegrationTest.java
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
package tudelft.mocks.invoice;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import java.sql.SQLException;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class InvoiceDaoIntegrationTest {
private final DatabaseConnection connection = new DatabaseConnection();
private final InvoiceDao dao = new InvoiceDao(connection);
@BeforeEach
void cleanup() throws SQLException {
/**
* Let's clean up the table before the test runs.
* That will avoid possible flaky tests.
*
* Note that doing a single 'truncate' here seems simple and enough for this exercise.
* In large systems, you will probably want to encapsulate the 'reset database' logic
* somewhere else. Or even make use of specific frameworks for that.
*/
connection.getConnection().prepareStatement("truncate table invoice").execute();
/**
* Maybe you also want to double check if the cleaning operation
* worked!
*/
List<Invoice> invoices = dao.all();
assertThat(invoices).isEmpty();
}
@AfterEach
void close() {
/**
* Closing up the connection might also be something you do
* at the end of each test.
* Or maybe only at the end of the entire test suite, just to optimize.
* (In practice, you should also use some connection pool, like C3P0,
* to handle connections)
*/
connection.close();
}
@Test
void save() {
final var inv1 = new InvoiceBuilder().build();
final var inv2 = new InvoiceBuilder().build();
dao.save(inv1);
List<Invoice> afterSaving = dao.all();
assertThat(afterSaving).containsExactlyInAnyOrder(inv1);
dao.save(inv2);
List<Invoice> afterSavingAgain = dao.all();
assertThat(afterSavingAgain).containsExactlyInAnyOrder(inv1, inv2);
}
@Test
void atLeast() {
int value = 50;
/**
* Explore the boundary: value >= x
* On point = x
* Off point = x-1
* In point = x + 1 (not really necessary, but it's cheap, and makes the
* test strategy easier to comprehend)
*/
final var inv1 = new InvoiceBuilder().withValue(value - 1).build();
final var inv2 = new InvoiceBuilder().withValue(value).build();
final var inv3 = new InvoiceBuilder().withValue(value + 1).build();
dao.save(inv1);
dao.save(inv2);
dao.save(inv3);
List<Invoice> afterSaving = dao.allWithAtLeast(value);
assertThat(afterSaving).containsExactlyInAnyOrder(inv2, inv3);
}
}