Skip to content

Commit 02cb0af

Browse files
committed
List bank accounts persisted in repository
Add the first port, a driven one, which allows to persist accounts. The domain should only provide the contract definition of how it interacts with the repository and the decision on how the mechanism is going to work in the production system is delayed without interrupting development. However, an in-memory implementation is available for test purposes so that mocking is not necessary.
1 parent 68ba233 commit 02cb0af

5 files changed

Lines changed: 66 additions & 5 deletions

File tree

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package lmirabal.bank
22

3+
import lmirabal.bank.data.BankAccountRepository
34
import lmirabal.bank.model.Amount
45
import lmirabal.bank.model.BankAccount
56
import lmirabal.bank.model.BankAccountId
67

7-
class BankService(val idFactory: () -> BankAccountId = { BankAccountId.random() }) {
8+
class BankService(
9+
private val accountRepository: BankAccountRepository,
10+
private val idFactory: () -> BankAccountId = { BankAccountId.random() }
11+
) {
812
fun createAccount(): BankAccount {
913
return BankAccount(idFactory(), Amount.ZERO)
14+
.also { newAccount -> accountRepository.add(newAccount) }
1015
}
16+
17+
fun listAccounts(): List<BankAccount> = accountRepository.list()
1118
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package lmirabal.bank.data
2+
3+
import lmirabal.bank.model.BankAccount
4+
5+
interface BankAccountRepository {
6+
fun add(account: BankAccount)
7+
fun list(): List<BankAccount>
8+
}

domain/src/test/kotlin/lmirabal/bank/BankServiceTest.kt

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,31 @@ package lmirabal.bank
22

33
import com.natpryce.hamkrest.assertion.assertThat
44
import com.natpryce.hamkrest.equalTo
5+
import lmirabal.bank.data.InMemoryBankAccountRepository
56
import lmirabal.bank.model.Amount
67
import lmirabal.bank.model.BankAccount
78
import lmirabal.bank.model.BankAccountId
89
import org.junit.jupiter.api.Test
910

1011
class BankServiceTest {
12+
private val id = BankAccountId.random()
13+
private val idFactory = { id }
14+
private val bank = BankService(InMemoryBankAccountRepository(), idFactory)
15+
1116
@Test
1217
fun createsAnAccount() {
13-
val id = BankAccountId.random()
14-
val idFactory = { id }
15-
val bank = BankService(idFactory)
16-
1718
val account = bank.createAccount()
1819

1920
assertThat(account, equalTo(BankAccount(id, Amount.ZERO)))
2021
}
22+
23+
@Test
24+
fun listsAccounts() {
25+
val account1 = bank.createAccount()
26+
val account2 = bank.createAccount()
27+
28+
val accounts = bank.listAccounts()
29+
30+
assertThat(accounts, equalTo(listOf(account1, account2)))
31+
}
2132
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package lmirabal.bank.data
2+
3+
import lmirabal.bank.model.BankAccount
4+
5+
class InMemoryBankAccountRepository : BankAccountRepository {
6+
private val accounts: MutableList<BankAccount> = arrayListOf()
7+
8+
override fun add(account: BankAccount) {
9+
accounts.add(account)
10+
}
11+
12+
override fun list(): List<BankAccount> = accounts
13+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package lmirabal.bank.data
2+
3+
import com.natpryce.hamkrest.assertion.assertThat
4+
import com.natpryce.hamkrest.equalTo
5+
import lmirabal.bank.model.Amount
6+
import lmirabal.bank.model.BankAccount
7+
import lmirabal.bank.model.BankAccountId
8+
import org.junit.jupiter.api.Test
9+
10+
class InMemoryBankAccountRepositoryTest {
11+
private val repository = InMemoryBankAccountRepository()
12+
13+
@Test
14+
fun persistsAccounts() {
15+
val account1 = BankAccount(BankAccountId.random(), Amount(10))
16+
repository.add(account1)
17+
val account2 = BankAccount(BankAccountId.random(), Amount(20))
18+
repository.add(account2)
19+
20+
assertThat(repository.list(), equalTo(listOf(account1, account2)))
21+
}
22+
}

0 commit comments

Comments
 (0)