Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions src/main/kotlin/Main.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import database.LocalDatabase
import database.VeterinaryPracticeDatabase
import database.mapper.CustomerEntityMapper
import database.mapper.PetEntityMapper
import database.search.Search
import database.search.SearchDatabase
import mapper.CustomerMapper
import mapper.PetMapper
import presenter.Presenter
Expand All @@ -12,12 +16,16 @@ val fileReader: Reader by lazy { FileReader() }
val customerMapper: CustomerMapper by lazy { CustomerMapper() }
val petMapper: PetMapper by lazy { PetMapper() }
val localDatabase: LocalDatabase by lazy { VeterinaryPracticeDatabase }
val customerEntityMapper: CustomerEntityMapper by lazy { CustomerEntityMapper() }
val petEntityMapper: PetEntityMapper by lazy { PetEntityMapper() }
val searchDatabase: Search by lazy { SearchDatabase(localDatabase, customerEntityMapper, petEntityMapper) }
val presenter: Presenter by lazy {
VeterinaryPracticePresenter(
fileReader,
customerMapper,
petMapper,
localDatabase
localDatabase,
searchDatabase
)
}

Expand All @@ -28,8 +36,8 @@ fun main() {
println("Hi, please enter as follows to use program... {path/filename} {search query}")

// receive and store inputs
var firstInput = ""
var secondInput = ""
val firstInput: String
val secondInput: String

try {
val result = readLine().toString().split(' ', limit = 2)
Expand Down
2 changes: 0 additions & 2 deletions src/main/kotlin/database/LocalDatabase.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package database

import database.model.SearchQueryResult
import model.Customer
import model.Pet

interface LocalDatabase {
fun insertCustomer(lineNumber: Int, customer: Customer)
fun insertPet(lineNumber: Int, pet: Pet)
fun query(query: String): SearchQueryResult
fun getAllCustomers(): HashMap<String, Customer>
fun getAllPets(): HashMap<String, Pet>
}
17 changes: 1 addition & 16 deletions src/main/kotlin/database/VeterinaryPracticeDatabase.kt
Original file line number Diff line number Diff line change
@@ -1,24 +1,13 @@
package database

import database.mapper.CustomerEntityMapper
import database.mapper.PetEntityMapper
import database.model.SearchQueryResult
import database.search.SearchDatabase
import model.Customer
import model.Pet

object VeterinaryPracticeDatabase: LocalDatabase {
object VeterinaryPracticeDatabase : LocalDatabase {

private val customerTable = HashMap<String, Customer>()
private val petTable = HashMap<String, Pet>()

// Injections
private val customerEntityMapper: CustomerEntityMapper by lazy { CustomerEntityMapper() }
private val petEntityMapper: PetEntityMapper by lazy { PetEntityMapper() }

// Violation. Tightly coupled
private val searchDatabase = SearchDatabase(this, customerEntityMapper, petEntityMapper)

override fun insertCustomer(lineNumber: Int, customer: Customer) {
return if (customerTable.containsKey(customer.id)) {
println("Error on line ${lineNumber + 1}: Customer already exists with identifier ${customer.id}")
Expand All @@ -37,10 +26,6 @@ object VeterinaryPracticeDatabase: LocalDatabase {
}
}

override fun query(query: String): SearchQueryResult {
return searchDatabase.queryAllDatabaseTable(query)
}

override fun getAllCustomers(): HashMap<String, Customer> {
return customerTable
}
Expand Down
6 changes: 4 additions & 2 deletions src/main/kotlin/presenter/VeterinaryPracticePresenter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package presenter

import database.LocalDatabase
import database.model.SearchQueryResult
import database.search.Search
import mapper.CustomerMapper
import mapper.PetMapper
import mapper.domain.CustomerMapperResult
Expand All @@ -16,7 +17,8 @@ class VeterinaryPracticePresenter(
private val fileReader: Reader,
private val customerMapper: CustomerMapper,
private val petMapper: PetMapper,
private val vetPracticeDatabase: LocalDatabase
private val vetPracticeDatabase: LocalDatabase,
private val searchDatabase: Search
) : Presenter {

private lateinit var view: ConsoleView
Expand Down Expand Up @@ -49,7 +51,7 @@ class VeterinaryPracticePresenter(
}

override fun search(query: String) {
when (val result = vetPracticeDatabase.query(query)) {
when (val result = searchDatabase.queryAllDatabaseTable(query)) {
is SearchQueryResult.CustomerAndPetSuccess -> view.showCustomersAndPets(result.customers, result.pets)
is SearchQueryResult.CustomerSuccess -> view.showCustomers(customers = result.customers)
is SearchQueryResult.PetSuccess -> view.showPets(result.pets)
Expand Down
26 changes: 4 additions & 22 deletions src/test/kotlin/database/VeterinaryPracticeDatabaseTest.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package database

import com.google.common.truth.Truth.assertThat
import database.search.SearchDatabase
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.impl.annotations.RelaxedMockK
import io.mockk.verify
import model.Customer
import model.Pet
import java.io.ByteArrayOutputStream
Expand All @@ -23,9 +20,6 @@ class VeterinaryPracticeDatabaseTest {
@RelaxedMockK
lateinit var mockPet: Pet

@MockK
lateinit var mockSearchDatabase: SearchDatabase

private val outputStreamCaptor = ByteArrayOutputStream()

private val subject by lazy { VeterinaryPracticeDatabase }
Expand Down Expand Up @@ -67,7 +61,7 @@ class VeterinaryPracticeDatabaseTest {
}

@Test
fun insertCustomer() {
fun `insertCustomer() - successfully`() {
//given
val expectedCustomer = hashMapOf("1" to mockCustomer)

Expand Down Expand Up @@ -112,7 +106,7 @@ class VeterinaryPracticeDatabaseTest {
}

@Test
fun insertPet() {
fun `insertPet() - successfully`() {
//given
val expectedPet = hashMapOf("1" to mockPet)

Expand All @@ -125,19 +119,7 @@ class VeterinaryPracticeDatabaseTest {
}

@Test
fun query() {
//given
val searchQuery = "albert"

//when
subject.query(searchQuery)

//then
verify { mockSearchDatabase.queryAllDatabaseTable(searchQuery) }
}

@Test
fun getAllCustomers() {
fun `getAllCustomers() - all customers in database are returned`() {
//given
val expectedCustomer = hashMapOf("1" to mockCustomer)

Expand All @@ -149,7 +131,7 @@ class VeterinaryPracticeDatabaseTest {
}

@Test
fun getAllPets() {
fun `getAllPets() - all pets in database are returned`() {
//given
val expectedPet = hashMapOf("1" to mockPet)

Expand Down
39 changes: 34 additions & 5 deletions src/test/kotlin/presenter/VeterinaryPracticePresenterTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import database.LocalDatabase
import database.entity.CustomerEntity
import database.entity.PetEntity
import database.model.SearchQueryResult
import database.search.SearchDatabase
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.RelaxedMockK
Expand Down Expand Up @@ -35,6 +36,9 @@ class VeterinaryPracticePresenterTest {
@RelaxedMockK
lateinit var mockLocalDatabase: LocalDatabase

@RelaxedMockK
lateinit var mockSearchDatabase: SearchDatabase

@RelaxedMockK
lateinit var mockView: ConsoleView

Expand All @@ -45,7 +49,8 @@ class VeterinaryPracticePresenterTest {
fileReader = mockFileReader,
customerMapper = mockCustomerMapper,
petMapper = mockPetMapper,
vetPracticeDatabase = mockLocalDatabase
vetPracticeDatabase = mockLocalDatabase,
searchDatabase = mockSearchDatabase
).apply {
setupWithView(mockView)
}
Expand Down Expand Up @@ -134,12 +139,24 @@ class VeterinaryPracticePresenterTest {
verify { mockView.showInvalidErrorMessage(1) }
}

@Test
fun `search() - verify queryAllDatabaseTable() function is called`() {
//given
val searchQuery = "albert"

//when
subject.search(searchQuery)

//then
verify { mockSearchDatabase.queryAllDatabaseTable(searchQuery) }
}

@Test
fun `search() - given query that matches to both a customer and a pet in the database then view customer and pet message is printed`() {
//given
val searchQuery = "albert"
every {
mockLocalDatabase.query(searchQuery)
mockSearchDatabase.queryAllDatabaseTable(searchQuery)
}.returns(
SearchQueryResult.CustomerAndPetSuccess(customerEntities, petEntities)
)
Expand All @@ -155,7 +172,11 @@ class VeterinaryPracticePresenterTest {
fun `search() - given query that matches a customer in the database then view customer is printed`() {
//given
val searchQuery = "sam"
every { mockLocalDatabase.query(searchQuery) }.returns(SearchQueryResult.CustomerSuccess(customerEntities))
every {
mockSearchDatabase.queryAllDatabaseTable(searchQuery)
}.returns(
SearchQueryResult.CustomerSuccess(customerEntities)
)

//when
subject.search(searchQuery)
Expand All @@ -168,7 +189,11 @@ class VeterinaryPracticePresenterTest {
fun `search() - given query that matches a pet in the database then pet is printed`() {
//given
val searchQuery = "sam"
every { mockLocalDatabase.query(searchQuery) }.returns(SearchQueryResult.PetSuccess(petEntities))
every {
mockSearchDatabase.queryAllDatabaseTable(searchQuery)
}.returns(
SearchQueryResult.PetSuccess(petEntities)
)

//when
subject.search(searchQuery)
Expand All @@ -181,7 +206,11 @@ class VeterinaryPracticePresenterTest {
fun `search() - given query that does not match either a customer or a pet in the database then view show error message printed`() {
//given
val searchQuery = "albert"
every { mockLocalDatabase.query(searchQuery) }.returns(SearchQueryResult.Error("no match found"))
every {
mockSearchDatabase.queryAllDatabaseTable(searchQuery)
}.returns(
SearchQueryResult.Error("no match found")
)

//when
subject.search(searchQuery)
Expand Down