Skip to content

Commit d3195fe

Browse files
committed
Refactor to use Spek
1 parent f678632 commit d3195fe

File tree

3 files changed

+133
-1
lines changed

3 files changed

+133
-1
lines changed

app/build.gradle

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ apply plugin: 'com.android.application'
33
apply plugin: 'kotlin-android'
44

55
apply plugin: 'kotlin-android-extensions'
6+
// junit5 doesn't support android projects out of the box
7+
apply plugin: 'de.mannodermaus.android-junit5'
68

79
android {
810
compileSdkVersion 28
@@ -20,16 +22,31 @@ android {
2022
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
2123
}
2224
}
25+
testOptions {
26+
junitPlatform {
27+
filters {
28+
engines {
29+
include 'spek2'
30+
}
31+
}
32+
}
33+
}
2334
}
2435

2536
dependencies {
2637
implementation fileTree(dir: 'libs', include: ['*.jar'])
27-
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
38+
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
2839
implementation 'com.android.support:appcompat-v7:28.0.0'
40+
2941
testImplementation 'junit:junit:4.12'
3042
testImplementation "org.mockito:mockito-core:2.27.0"
3143
testImplementation 'com.github.IvanShafran:shared-preferences-mock:1.0'
3244
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0"
45+
// spek2
46+
testImplementation "org.spekframework.spek2:spek-dsl-jvm:$spek_version"
47+
testImplementation "org.spekframework.spek2:spek-runner-junit5:$spek_version"
48+
testImplementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
49+
3350
androidTestImplementation 'com.android.support.test:runner:1.0.2'
3451
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
3552
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package com.github.ivanshafran.unit_tests_evolution.v5
2+
3+
import com.github.ivanshafran.sharedpreferencesmock.SPMockBuilder
4+
import com.github.ivanshafran.unit_tests_evolution.BuyPreferencesImpl
5+
import com.github.ivanshafran.unit_tests_evolution.RateUsPreferencesImpl
6+
import com.github.ivanshafran.unit_tests_evolution.ShowRateUsLogic
7+
import com.github.ivanshafran.unit_tests_evolution.Time
8+
import com.nhaarman.mockitokotlin2.mock
9+
import com.nhaarman.mockitokotlin2.whenever
10+
import org.junit.Assert
11+
import org.spekframework.spek2.Spek
12+
import org.spekframework.spek2.style.specification.describe
13+
import java.util.*
14+
import java.util.concurrent.TimeUnit
15+
16+
class ShowRateUsLogicTest : Spek({
17+
18+
val calendar = Calendar.getInstance()
19+
calendar.set(2019, Calendar.JULY, 7)
20+
21+
val SOME_DAY_IN_MILLIS = calendar.timeInMillis
22+
val LESS_THAN_TWO_MONTHS = TimeUnit.DAYS.toMillis(59)
23+
val MORE_THAN_TWO_MONTHS = TimeUnit.DAYS.toMillis(61)
24+
25+
val mockedContext = SPMockBuilder().createContext()
26+
27+
val rateUsPreferences by memoized { RateUsPreferencesImpl(mockedContext) }
28+
val buyPreferences by memoized { BuyPreferencesImpl(mockedContext) }
29+
val time by memoized { mock<Time>() }
30+
val showRateUsLogic by memoized {
31+
ShowRateUsLogic(
32+
rateUsPreferences,
33+
buyPreferences,
34+
time
35+
)
36+
}
37+
38+
fun prepareConditions(
39+
buyClickedTimes: Int = 0,
40+
isNeverShownAgainClicked: Boolean = false,
41+
isRateNowClicked: Boolean = false,
42+
lastShownTimeMillis: Long = 0,
43+
currentTimeMillis: Long = System.currentTimeMillis()
44+
) {
45+
repeat(buyClickedTimes) { buyPreferences.incrementBuyCount() }
46+
47+
if (isNeverShownAgainClicked) rateUsPreferences.setNeverShownAgainClicked()
48+
if (isRateNowClicked) rateUsPreferences.setRateNowClickedClicked()
49+
rateUsPreferences.setLastShownTimeMillis(lastShownTimeMillis)
50+
51+
whenever(time.getCurrentTimeMillis()).thenReturn(currentTimeMillis)
52+
}
53+
54+
describe("show rate us logic") {
55+
56+
context("first conditions checks") {
57+
context("buy clicked once") {
58+
beforeEachTest {
59+
prepareConditions(buyClickedTimes = 1)
60+
}
61+
62+
it("should not show 'rate us'") {
63+
Assert.assertFalse(showRateUsLogic.shouldShowRateUs())
64+
}
65+
}
66+
67+
context("buy clicked two times") {
68+
beforeEachTest {
69+
prepareConditions(buyClickedTimes = 2)
70+
}
71+
72+
it("should show 'rate us'") {
73+
Assert.assertTrue(showRateUsLogic.shouldShowRateUs())
74+
}
75+
}
76+
}
77+
78+
context("'rate us' was shown already") {
79+
context("user clicked 'show me later' on the dialog") {
80+
context("less than two months passed and user clicks buy") {
81+
beforeEachTest {
82+
prepareConditions(
83+
buyClickedTimes = 3,
84+
lastShownTimeMillis = SOME_DAY_IN_MILLIS,
85+
currentTimeMillis = SOME_DAY_IN_MILLIS + MORE_THAN_TWO_MONTHS
86+
)
87+
}
88+
89+
it("should show 'rate us' again") {
90+
Assert.assertTrue(showRateUsLogic.shouldShowRateUs())
91+
}
92+
}
93+
94+
context("more than two months passed and user clicks buy") {
95+
beforeEachTest {
96+
prepareConditions(
97+
buyClickedTimes = 3,
98+
lastShownTimeMillis = SOME_DAY_IN_MILLIS,
99+
currentTimeMillis = SOME_DAY_IN_MILLIS + MORE_THAN_TWO_MONTHS
100+
)
101+
}
102+
103+
it("should show 'rate us' again") {
104+
Assert.assertTrue(showRateUsLogic.shouldShowRateUs())
105+
}
106+
}
107+
}
108+
}
109+
}
110+
})

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
buildscript {
44
ext.kotlin_version = '1.3.31'
5+
ext.spek_version = '2.0.6'
6+
ext.android_junit5_version = '1.4.2.0'
7+
ext.junit5_runner = '0.2.2'
8+
59
repositories {
610
google()
711
jcenter()
@@ -10,6 +14,7 @@ buildscript {
1014
dependencies {
1115
classpath 'com.android.tools.build:gradle:3.4.2'
1216
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
17+
classpath "de.mannodermaus.gradle.plugins:android-junit5:$android_junit5_version"
1318
// NOTE: Do not place your application dependencies here; they belong
1419
// in the individual module build.gradle files
1520
}

0 commit comments

Comments
 (0)