Skip to content

Commit 6599f08

Browse files
Merge branch 'tests-experimenting' into development
2 parents f076097 + bd0bf3a commit 6599f08

File tree

13 files changed

+287
-31
lines changed

13 files changed

+287
-31
lines changed

analytics/build.gradle

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,32 @@ android {
3737
}
3838
}
3939

40+
// testOptions {
41+
// unitTests.returnDefaultValues = true
42+
// }
4043
}
4144

4245
dependencies {
46+
4347
implementation fileTree(dir: 'libs', include: ['*.jar'])
4448

49+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
50+
4551
implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
4652
testImplementation 'junit:junit:4.12'
53+
54+
4755
androidTestImplementation 'com.android.support.test:runner:1.0.2'
4856
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
49-
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
50-
57+
// required if you want to use Mockito for unit tests
58+
testImplementation 'org.mockito:mockito-core:2.7.22'
59+
// required if you want to use Mockito for Android tests
60+
androidTestImplementation 'org.mockito:mockito-android:2.7.22'
61+
62+
// testCompile 'org.powermock:powermock:1.6.5'
63+
// testCompile 'org.powermock:powermock-module-junit4:1.6.5'
64+
//
65+
// testCompile 'org.powermock:powermock-api-mockito:1.6.5'
5166

5267

5368
}

analytics/src/main/java/com/sofakingforever/analytics/Analytics.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.sofakingforever.analytics
33
import android.content.Context
44
import android.util.Log
55
import com.sofakingforever.analytics.events.base.Event
6+
import com.sofakingforever.analytics.exceptions.EventNotTrackedException
67

78
/**
89
* The *Analytics* class is in charge of tracking any *Event* implementation.
@@ -47,8 +48,7 @@ class Analytics(context: Context, private vararg val dispatchers: AnalyticsDispa
4748
try {
4849
dispatcher.track(it)
4950
} catch (e: Exception) {
50-
Log.e("Analytics", "${dispatcher.kit.name} dispatcher couldn't fire \"${it.javaClass.name}\" event", e)
51-
settings.exceptionHandler?.onException(e)
51+
settings.exceptionHandler?.onException(EventNotTrackedException(dispatcher, it, e))
5252
}
5353
}
5454

@@ -58,18 +58,10 @@ class Analytics(context: Context, private vararg val dispatchers: AnalyticsDispa
5858

5959
fun setKitEnabled(kit: AnalyticsKit, enabled: Boolean) {
6060
enabledKitMap[kit] = enabled
61-
// dispatchers.filter { d -> d.kit == kit }
62-
// .forEach { dispatcher ->
63-
//
64-
// }
6561
}
6662

6763
fun setDispatcherEnabled(dispatcherName: String, enabled: Boolean) {
6864
enabledDispatcherMap[dispatcherName] = enabled
69-
// dispatchers.filter { d -> d.dispatcherName == dispatcherName }
70-
// .forEach { dispatcher ->
71-
// dispatcher.enabled = enabled
72-
// }
7365
}
7466

7567
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.sofakingforever.analytics.exceptions
2+
3+
import com.sofakingforever.analytics.AnalyticsDispatcher
4+
import com.sofakingforever.analytics.events.base.Event
5+
6+
class EventNotTrackedException(message: String?, cause: Throwable?) : RuntimeException(message, cause) {
7+
8+
constructor(dispatcher: AnalyticsDispatcher, event: Event, t: Throwable) : this("${dispatcher.dispatcherName} dispatcher couldn't fire \"${event.javaClass.name}\" event", t)
9+
10+
}

analytics/src/main/java/com/sofakingforever/analytics/kits/logger/LoggerDispatcherImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ class LoggerDispatcherImpl(override val init: Boolean) : AnalyticsDispatcher {
2222
constructor() : this(true)
2323

2424

25-
2625
private val tag = dispatcherName
2726

2827
override val kit: AnalyticsKit = LoggerKit.instance
@@ -42,7 +41,8 @@ class LoggerDispatcherImpl(override val init: Boolean) : AnalyticsDispatcher {
4241
override fun trackInviteEvent(inviteEvent: InviteEvent) {
4342
Log.d(tag, "Tracking inviteEvent ${inviteEvent.packageName}")
4443
}
44+
4545
override fun setUserProperty(property: SetUserProperty) {
46-
// used only for certain analytics
46+
Log.d(tag, "Tracking user property ${property.key} = ${property.value}")
4747
}
4848
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package com.sofakingforever.library
2+
3+
import android.content.Context
4+
import android.util.Log
5+
import com.sofakingforever.analytics.Analytics
6+
import com.sofakingforever.analytics.AnalyticsSettings
7+
import com.sofakingforever.analytics.exceptions.EventNotTrackedException
8+
import com.sofakingforever.analytics.exceptions.UnsupportedEventException
9+
import com.sofakingforever.library.dispatcher.TestKit
10+
import com.sofakingforever.library.dispatcher.TestableDispatcher
11+
import com.sofakingforever.library.events.InitDispatcherEvent
12+
import com.sofakingforever.library.events.TestContentViewEvent
13+
import com.sofakingforever.library.events.TestCustomEvent
14+
import com.sofakingforever.library.events.UnsupportedEvent
15+
import org.junit.Test
16+
import org.mockito.Mockito
17+
import org.mockito.Mockito.mock
18+
19+
class AnalyticsUnitTest {
20+
21+
private val contextMock = mock(Context::class.java)
22+
23+
private lateinit var analytics: Analytics
24+
25+
private val dispatcher = TestableDispatcher()
26+
private var raisedException: Exception? = null
27+
28+
init {
29+
Mockito.`when`(contextMock.applicationContext).thenReturn(contextMock)
30+
}
31+
32+
@Test
33+
fun testAnalytics() {
34+
35+
analytics = Analytics(contextMock, dispatcher).apply {
36+
37+
this.settings.exceptionHandler = object : AnalyticsSettings.ExceptionHandler {
38+
override fun onException(e: Exception) {
39+
raisedException = e
40+
}
41+
42+
}
43+
}
44+
45+
// track some events
46+
trackTestEvents()
47+
48+
// assert events
49+
assertEvents()
50+
51+
// assert no exceptions were raised
52+
assert(raisedException == null)
53+
54+
// track an unsupported event
55+
analytics.track(UnsupportedEvent())
56+
57+
// assert UnsupportedEventException was raised
58+
assert(raisedException != null)
59+
assert(raisedException is EventNotTrackedException)
60+
assert((raisedException as EventNotTrackedException).cause is UnsupportedEventException)
61+
62+
}
63+
64+
65+
private fun trackTestEvents() {
66+
67+
analytics.track(TestCustomEvent(1))
68+
69+
analytics.setDispatcherEnabled(TestableDispatcher.DispatcherName, false)
70+
71+
analytics.track(TestCustomEvent(2))
72+
73+
analytics.setDispatcherEnabled(TestableDispatcher.DispatcherName, true)
74+
75+
analytics.track(TestCustomEvent(3))
76+
77+
analytics.setKitEnabled(TestKit.instance, false)
78+
79+
analytics.track(TestCustomEvent(4))
80+
81+
analytics.setKitEnabled(TestKit.instance, true)
82+
83+
analytics.track(TestCustomEvent(5))
84+
85+
analytics.track(TestContentViewEvent(1))
86+
87+
}
88+
89+
90+
private fun assertEvents() {
91+
92+
93+
val eventList = dispatcher.eventList
94+
95+
// expect to find 3 custom events , 1 contentview and 1 init event
96+
assert(eventList.size == 5)
97+
assert(eventList[0] is InitDispatcherEvent)
98+
assert((eventList[1] as TestCustomEvent).number == 1)
99+
assert((eventList[2] as TestCustomEvent).number == 3)
100+
assert((eventList[3] as TestCustomEvent).number == 5)
101+
assert((eventList[4] as TestContentViewEvent).number == 1)
102+
}
103+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.sofakingforever.library
2+
3+
import android.app.Application
4+
import com.sofakingforever.library.dispatcher.TestableDispatcher
5+
import com.sofakingforever.library.events.InitDispatcherEvent
6+
import com.sofakingforever.library.events.TestCustomEvent
7+
import org.junit.Test
8+
9+
10+
class DispatcherTest {
11+
12+
private lateinit var raisedException: Exception
13+
14+
@Test
15+
fun testDispatcher() {
16+
17+
val dispatcher = TestableDispatcher()
18+
19+
dispatcher.initDispatcher(Application())
20+
21+
dispatcher.track(TestCustomEvent(1))
22+
23+
dispatcher.track(TestCustomEvent(2))
24+
25+
dispatcher.track(TestCustomEvent(3))
26+
27+
dispatcher.track(TestCustomEvent(4))
28+
29+
dispatcher.track(TestCustomEvent(5))
30+
31+
val eventList = dispatcher.eventList
32+
33+
// expect to find 5 events + init event
34+
assert(eventList.size == 6)
35+
assert(eventList[0] is InitDispatcherEvent)
36+
assert((eventList[1] as TestCustomEvent).number == 1)
37+
38+
// that's enough
39+
40+
}
41+
}

analytics/src/test/java/com/sofakingforever/library/ExampleUnitTest.java

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.sofakingforever.library.dispatcher
2+
3+
import com.sofakingforever.analytics.AnalyticsKit
4+
5+
class TestKit private constructor() : AnalyticsKit {
6+
override val name: String = "Test Kit"
7+
8+
private object Holder {
9+
val INSTANCE = TestKit()
10+
}
11+
12+
companion object {
13+
val instance: TestKit by lazy { Holder.INSTANCE }
14+
}
15+
16+
17+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.sofakingforever.library.dispatcher
2+
3+
import android.content.Context
4+
import com.sofakingforever.analytics.AnalyticsDispatcher
5+
import com.sofakingforever.analytics.AnalyticsKit
6+
import com.sofakingforever.analytics.events.ContentViewEvent
7+
import com.sofakingforever.analytics.events.CustomEvent
8+
import com.sofakingforever.analytics.events.InviteEvent
9+
import com.sofakingforever.analytics.events.SetUserProperty
10+
import com.sofakingforever.analytics.events.base.Event
11+
import com.sofakingforever.library.events.InitDispatcherEvent
12+
13+
class TestableDispatcher : AnalyticsDispatcher {
14+
15+
override val init: Boolean = true
16+
17+
override val kit: AnalyticsKit = TestKit.instance
18+
19+
override val dispatcherName: String = DispatcherName
20+
21+
val eventList: MutableList<Event> = mutableListOf()
22+
23+
override fun initDispatcher(context: Context) {
24+
track(InitDispatcherEvent())
25+
}
26+
27+
override fun trackContentView(contentView: ContentViewEvent) {
28+
eventList.add(contentView)
29+
}
30+
31+
override fun trackCustomEvent(event: CustomEvent) {
32+
eventList.add(event)
33+
}
34+
35+
override fun trackInviteEvent(inviteEvent: InviteEvent) {
36+
eventList.add(inviteEvent)
37+
}
38+
39+
override fun setUserProperty(property: SetUserProperty) {
40+
eventList.add(property)
41+
}
42+
43+
override fun track(event: Event) {
44+
if (event is InitDispatcherEvent) {
45+
eventList.add(event)
46+
} else {
47+
super.track(event)
48+
}
49+
}
50+
51+
companion object {
52+
const val DispatcherName = "TestDispatcher"
53+
}
54+
55+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.sofakingforever.library.events
2+
3+
import com.sofakingforever.analytics.events.base.Event
4+
5+
class InitDispatcherEvent : Event
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.sofakingforever.library.events
2+
3+
import com.sofakingforever.analytics.AnalyticsKit
4+
import com.sofakingforever.analytics.events.ContentViewEvent
5+
6+
class TestContentViewEvent(val number: Int) : ContentViewEvent {
7+
override fun getViewName(kit: AnalyticsKit): String = "Content View #$number"
8+
9+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.sofakingforever.library.events
2+
3+
import com.sofakingforever.analytics.AnalyticsKit
4+
import com.sofakingforever.analytics.events.CustomEvent
5+
6+
class TestCustomEvent(val number: Int) : CustomEvent {
7+
override fun getEventName(kit: AnalyticsKit): String = "Custom Event #$number"
8+
9+
override fun getParameters(kit: AnalyticsKit): MutableMap<String, Any> {
10+
val parameters = super.getParameters(kit)
11+
parameters["int"] = -2
12+
parameters["long"] = +2L
13+
parameters["boolean"] = true
14+
parameters["string"] = "fun #$number"
15+
return parameters
16+
}
17+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.sofakingforever.library.events
2+
3+
import com.sofakingforever.analytics.events.base.Event
4+
5+
/**
6+
* This unsupported event is not handled in the Dispatcher.
7+
* You must override the dispatcher's track function to handle it
8+
*/
9+
class UnsupportedEvent : Event

0 commit comments

Comments
 (0)