From fd47f3f48bd389a7f6fa4fbc71e706856ad57d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Velimir=20=C4=90urkovi=C4=87?= Date: Sat, 15 Jul 2023 18:18:00 +0200 Subject: [PATCH] Add unit tests --- pom.xml | 8 ++- .../kotlin/processor/ArgumentProcessorImpl.kt | 2 +- src/test/kotlin/display/TerminalImplTest.kt | 25 +++++++ .../generator/PasswordGeneratorImplTest.kt | 66 +++++++++++++++++++ .../RandomCharacterGeneratorImplTest.kt | 42 ++++++++++++ .../processor/ArgumentProcessorImplTest.kt | 48 ++++++++++++++ .../kotlin/shuffler/StringShufflerImplTest.kt | 21 ++++++ .../validator/ArgumentValidatorImplTest.kt | 19 ++++++ 8 files changed, 229 insertions(+), 2 deletions(-) create mode 100644 src/test/kotlin/display/TerminalImplTest.kt create mode 100644 src/test/kotlin/generator/PasswordGeneratorImplTest.kt create mode 100644 src/test/kotlin/generator/RandomCharacterGeneratorImplTest.kt create mode 100644 src/test/kotlin/processor/ArgumentProcessorImplTest.kt create mode 100644 src/test/kotlin/shuffler/StringShufflerImplTest.kt create mode 100644 src/test/kotlin/validator/ArgumentValidatorImplTest.kt diff --git a/pom.xml b/pom.xml index cb6501e..97481c2 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ org.junit.jupiter junit-jupiter-engine - 5.9.2 + 5.6.3 test @@ -86,6 +86,12 @@ kotlin-stdlib-jdk8 1.9.0 + + io.mockk + mockk + 1.12.4 + test + \ No newline at end of file diff --git a/src/main/kotlin/processor/ArgumentProcessorImpl.kt b/src/main/kotlin/processor/ArgumentProcessorImpl.kt index 76ce38b..be97adf 100644 --- a/src/main/kotlin/processor/ArgumentProcessorImpl.kt +++ b/src/main/kotlin/processor/ArgumentProcessorImpl.kt @@ -11,7 +11,7 @@ class ArgumentProcessorImpl( private val terminal: Terminal ) : ArgumentProcessor { override fun process(args: Array) { - if (!argumentValidator.validate(args!!)) { + if (!argumentValidator.validate(args)) { val usage = "Usage:" + System.getProperty("line.separator") + "java -jar ./demo-kotlin-cli.jar generate password" terminal.show(usage) diff --git a/src/test/kotlin/display/TerminalImplTest.kt b/src/test/kotlin/display/TerminalImplTest.kt new file mode 100644 index 0000000..bd2b443 --- /dev/null +++ b/src/test/kotlin/display/TerminalImplTest.kt @@ -0,0 +1,25 @@ +package display + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import java.io.ByteArrayOutputStream +import java.io.PrintStream + +class TerminalImplTest { + private val sut: Terminal = TerminalImpl() + + @Test + fun show() { + val message = "Test Message" + val expected = message + System.getProperty("line.separator") + + val standardOut = System.out + val outputStreamCaptor = ByteArrayOutputStream() + + System.setOut(PrintStream(outputStreamCaptor)) + sut.show(message) + System.setOut(standardOut) + + assertEquals(expected, outputStreamCaptor.toString()) + } +} \ No newline at end of file diff --git a/src/test/kotlin/generator/PasswordGeneratorImplTest.kt b/src/test/kotlin/generator/PasswordGeneratorImplTest.kt new file mode 100644 index 0000000..6ba44fe --- /dev/null +++ b/src/test/kotlin/generator/PasswordGeneratorImplTest.kt @@ -0,0 +1,66 @@ +package generator + +import io.mockk.mockk +import io.mockk.verify +import org.junit.jupiter.api.Test +import shuffler.StringShuffler + +class PasswordGeneratorImplTest { + private val randomCharacterGenerator: RandomCharacterGenerator = mockk(relaxed = true) + private val stringShuffler: StringShuffler = mockk(relaxed = true) + private val sut: PasswordGenerator = PasswordGeneratorImpl(randomCharacterGenerator, stringShuffler) + + @Test + fun generateShouldCallGenerateUppercaseCharacter() { + sut.generate() + + verify(exactly = 1) { + randomCharacterGenerator.generateUppercaseCharacter() + } + } + + @Test + fun generateShouldCallGenerateLowercaseCharacter() { + sut.generate() + + verify(exactly = 1) { + randomCharacterGenerator.generateLowercaseCharacter() + } + } + + @Test + fun generateShouldCallGenerateDigitCharacter() { + sut.generate() + + verify(exactly = 1) { + randomCharacterGenerator.generateDigitCharacter() + } + } + + @Test + fun generateShouldCallGenerateSpecialCharacter() { + sut.generate() + + verify(exactly = 1) { + randomCharacterGenerator.generateSpecialCharacter() + } + } + + @Test + fun generateShouldCallGenerateAllowedCharacter12Times() { + sut.generate() + + verify(exactly = 12) { + randomCharacterGenerator.generateAllowedCharacter() + } + } + + @Test + fun generateShouldCallShuffle() { + sut.generate() + + verify(exactly = 1) { + stringShuffler.shuffle(any()) + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/generator/RandomCharacterGeneratorImplTest.kt b/src/test/kotlin/generator/RandomCharacterGeneratorImplTest.kt new file mode 100644 index 0000000..8000fd3 --- /dev/null +++ b/src/test/kotlin/generator/RandomCharacterGeneratorImplTest.kt @@ -0,0 +1,42 @@ +package generator + +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +class RandomCharacterGeneratorImplTest { + private val uppercaseCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + private val lowercaseCharacters = "abcdefghijklmnopqrstuvwxyz" + private val digitCharacters = "0123456789" + private val specialCharacters = "~`!@#$%^&*()-_=+[{]}\\|;:\'\",<.>/?" + private val allowedCharacters = uppercaseCharacters + .plus(lowercaseCharacters) + .plus(digitCharacters) + .plus(specialCharacters) + + private val sut: RandomCharacterGenerator = RandomCharacterGeneratorImpl() + + @Test + fun generateUppercaseCharacter() { + assertTrue(uppercaseCharacters.contains(sut.generateUppercaseCharacter())) + } + + @Test + fun generateLowercaseCharacter() { + assertTrue(lowercaseCharacters.contains(sut.generateLowercaseCharacter())) + } + + @Test + fun generateDigitCharacter() { + assertTrue(digitCharacters.contains(sut.generateDigitCharacter())) + } + + @Test + fun generateSpecialCharacter() { + assertTrue(specialCharacters.contains(sut.generateSpecialCharacter())) + } + + @Test + fun generateAllowedCharacter() { + assertTrue(allowedCharacters.contains(sut.generateAllowedCharacter())) + } +} \ No newline at end of file diff --git a/src/test/kotlin/processor/ArgumentProcessorImplTest.kt b/src/test/kotlin/processor/ArgumentProcessorImplTest.kt new file mode 100644 index 0000000..f108a16 --- /dev/null +++ b/src/test/kotlin/processor/ArgumentProcessorImplTest.kt @@ -0,0 +1,48 @@ +package processor + +import display.Terminal +import generator.PasswordGenerator +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import org.junit.jupiter.api.Test +import validator.ArgumentValidator + +class ArgumentProcessorImplTest { + private val argumentValidator: ArgumentValidator = mockk() + private val passwordGenerator: PasswordGenerator = mockk() + private val terminal: Terminal = mockk(relaxed = true) + private val sut: ArgumentProcessor = ArgumentProcessorImpl(argumentValidator, passwordGenerator, terminal) + + @Test + fun processGeneratePassword() { + val args = arrayOf("generate", "password") + every { argumentValidator.validate(args) } returns true + + val sample = "A8!(,wV5YuI[Vr^>" + every { passwordGenerator.generate() } returns sample + + sut.process(args) + + verify(exactly = 1) { + argumentValidator.validate(args) + passwordGenerator.generate() + terminal.show(sample) + } + } + + @Test + fun processInvalidArguments() { + val usage = "Usage:" + System.getProperty("line.separator") + + "java -jar ./demo-kotlin-cli.jar generate password" + val args = arrayOf() + every { argumentValidator.validate(args) } returns false + + sut.process(args) + + verify(exactly = 1) { + argumentValidator.validate(args) + terminal.show(usage) + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/shuffler/StringShufflerImplTest.kt b/src/test/kotlin/shuffler/StringShufflerImplTest.kt new file mode 100644 index 0000000..be39785 --- /dev/null +++ b/src/test/kotlin/shuffler/StringShufflerImplTest.kt @@ -0,0 +1,21 @@ +package shuffler + +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +class StringShufflerImplTest { + private val sut: StringShuffler = StringShufflerImpl() + + @Test + fun shuffle() { + val sample = "A8!(,wV5YuI[Vr^>" + val actual: String = sut.shuffle(sample) + + assertNotEquals(sample, actual) + assertEquals(sample.length, actual.length) + + for (item in sample.toCharArray()) { + assertTrue(actual.contains(item.toString())) + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/validator/ArgumentValidatorImplTest.kt b/src/test/kotlin/validator/ArgumentValidatorImplTest.kt new file mode 100644 index 0000000..c4d6817 --- /dev/null +++ b/src/test/kotlin/validator/ArgumentValidatorImplTest.kt @@ -0,0 +1,19 @@ +package validator + +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +class ArgumentValidatorImplTest { + private val sut: ArgumentValidator = ArgumentValidatorImpl() + + @Test + fun validateCheckForGeneratePassword() { + assertTrue(sut.validate(arrayOf("generate", "password"))) + } + + @Test + fun validateCheckForInvalidArguments() { + assertFalse(sut.validate(emptyArray())) + } +} \ No newline at end of file