From 6ee5b3195863c9b71e4c5c6afb317946bdca1dde Mon Sep 17 00:00:00 2001 From: Andre Hitchman Date: Wed, 10 Nov 2021 10:26:37 +0000 Subject: [PATCH] remove tight coupling of SearchDatabase from VeterinaryPracticeDatabase.kt --- src/main/kotlin/Main.kt | 14 +++++-- src/main/kotlin/database/LocalDatabase.kt | 2 - .../database/VeterinaryPracticeDatabase.kt | 17 +------- .../presenter/VeterinaryPracticePresenter.kt | 6 ++- .../VeterinaryPracticeDatabaseTest.kt | 26 ++----------- .../VeterinaryPracticePresenterTest.kt | 39 ++++++++++++++++--- 6 files changed, 54 insertions(+), 50 deletions(-) diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index 1d3794d..8389f9c 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -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 @@ -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 ) } @@ -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) diff --git a/src/main/kotlin/database/LocalDatabase.kt b/src/main/kotlin/database/LocalDatabase.kt index 3bec7cf..3a4b362 100644 --- a/src/main/kotlin/database/LocalDatabase.kt +++ b/src/main/kotlin/database/LocalDatabase.kt @@ -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 fun getAllPets(): HashMap } \ No newline at end of file diff --git a/src/main/kotlin/database/VeterinaryPracticeDatabase.kt b/src/main/kotlin/database/VeterinaryPracticeDatabase.kt index 4bc1da8..21b2bbb 100644 --- a/src/main/kotlin/database/VeterinaryPracticeDatabase.kt +++ b/src/main/kotlin/database/VeterinaryPracticeDatabase.kt @@ -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() private val petTable = HashMap() - // 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}") @@ -37,10 +26,6 @@ object VeterinaryPracticeDatabase: LocalDatabase { } } - override fun query(query: String): SearchQueryResult { - return searchDatabase.queryAllDatabaseTable(query) - } - override fun getAllCustomers(): HashMap { return customerTable } diff --git a/src/main/kotlin/presenter/VeterinaryPracticePresenter.kt b/src/main/kotlin/presenter/VeterinaryPracticePresenter.kt index 13ee56e..d1274a7 100644 --- a/src/main/kotlin/presenter/VeterinaryPracticePresenter.kt +++ b/src/main/kotlin/presenter/VeterinaryPracticePresenter.kt @@ -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 @@ -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 @@ -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) diff --git a/src/test/kotlin/database/VeterinaryPracticeDatabaseTest.kt b/src/test/kotlin/database/VeterinaryPracticeDatabaseTest.kt index a2099a1..cc53f2f 100644 --- a/src/test/kotlin/database/VeterinaryPracticeDatabaseTest.kt +++ b/src/test/kotlin/database/VeterinaryPracticeDatabaseTest.kt @@ -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 @@ -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 } @@ -67,7 +61,7 @@ class VeterinaryPracticeDatabaseTest { } @Test - fun insertCustomer() { + fun `insertCustomer() - successfully`() { //given val expectedCustomer = hashMapOf("1" to mockCustomer) @@ -112,7 +106,7 @@ class VeterinaryPracticeDatabaseTest { } @Test - fun insertPet() { + fun `insertPet() - successfully`() { //given val expectedPet = hashMapOf("1" to mockPet) @@ -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) @@ -149,7 +131,7 @@ class VeterinaryPracticeDatabaseTest { } @Test - fun getAllPets() { + fun `getAllPets() - all pets in database are returned`() { //given val expectedPet = hashMapOf("1" to mockPet) diff --git a/src/test/kotlin/presenter/VeterinaryPracticePresenterTest.kt b/src/test/kotlin/presenter/VeterinaryPracticePresenterTest.kt index 8778d07..26a470d 100644 --- a/src/test/kotlin/presenter/VeterinaryPracticePresenterTest.kt +++ b/src/test/kotlin/presenter/VeterinaryPracticePresenterTest.kt @@ -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 @@ -35,6 +36,9 @@ class VeterinaryPracticePresenterTest { @RelaxedMockK lateinit var mockLocalDatabase: LocalDatabase + @RelaxedMockK + lateinit var mockSearchDatabase: SearchDatabase + @RelaxedMockK lateinit var mockView: ConsoleView @@ -45,7 +49,8 @@ class VeterinaryPracticePresenterTest { fileReader = mockFileReader, customerMapper = mockCustomerMapper, petMapper = mockPetMapper, - vetPracticeDatabase = mockLocalDatabase + vetPracticeDatabase = mockLocalDatabase, + searchDatabase = mockSearchDatabase ).apply { setupWithView(mockView) } @@ -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) ) @@ -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) @@ -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) @@ -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)