From 654efea7e5fb173beecac31dc501c8a91da804aa Mon Sep 17 00:00:00 2001
From: Christian Schabesberger <chris.schabesberger@mailbox.org>
Date: Tue, 22 Sep 2020 17:15:45 +0200
Subject: [PATCH] add tests for cookie jar

---
 .../android/lib/common/http/CookieJarImpl.kt  | 10 +--
 .../owncloud/android/lib/CookieJarImplTest.kt | 74 +++++++++++++++++++
 2 files changed, 79 insertions(+), 5 deletions(-)
 create mode 100644 owncloudComLibrary/src/test/java/com/owncloud/android/lib/CookieJarImplTest.kt

diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/CookieJarImpl.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/CookieJarImpl.kt
index 9070c812..83ad8f5c 100644
--- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/CookieJarImpl.kt
+++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/CookieJarImpl.kt
@@ -8,7 +8,7 @@ class CookieJarImpl(
     private val sCookieStore: HashMap<String, List<Cookie>>
 ) : CookieJar {
 
-    private fun containsCookieWithName(cookies: List<Cookie>, name: String): Boolean {
+    fun containsCookieWithName(cookies: List<Cookie>, name: String): Boolean {
         for (cookie: Cookie in cookies) {
             if (cookie.name == name) {
                 return true;
@@ -17,7 +17,7 @@ class CookieJarImpl(
         return false;
     }
 
-    private fun getUpdatedCookies(oldCookies: List<Cookie>, newCookies: List<Cookie>): List<Cookie> {
+    fun getUpdatedCookies(oldCookies: List<Cookie>, newCookies: List<Cookie>): List<Cookie> {
         val updatedList = ArrayList<Cookie>(newCookies);
         for (oldCookie: Cookie in oldCookies) {
             if (!containsCookieWithName(updatedList, oldCookie.name)) {
@@ -27,11 +27,11 @@ class CookieJarImpl(
         return updatedList;
     }
 
-    override fun saveFromResponse(url: HttpUrl, newCookies: List<Cookie>) {
+    override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
         // Avoid duplicated cookies but update
         val currentCookies: List<Cookie> = sCookieStore[url.host] ?: ArrayList()
-        val updatedCookies: List<Cookie> = getUpdatedCookies(currentCookies, newCookies);
-        sCookieStore.put(url.host, updatedCookies);
+        val updatedCookies: List<Cookie> = getUpdatedCookies(currentCookies, cookies);
+        sCookieStore[url.host] = updatedCookies;
     }
 
     override fun loadForRequest(url: HttpUrl) =
diff --git a/owncloudComLibrary/src/test/java/com/owncloud/android/lib/CookieJarImplTest.kt b/owncloudComLibrary/src/test/java/com/owncloud/android/lib/CookieJarImplTest.kt
new file mode 100644
index 00000000..f0e62a1f
--- /dev/null
+++ b/owncloudComLibrary/src/test/java/com/owncloud/android/lib/CookieJarImplTest.kt
@@ -0,0 +1,74 @@
+package com.owncloud.android.lib
+
+import com.owncloud.android.lib.common.http.CookieJarImpl
+import junit.framework.Assert.assertEquals
+import junit.framework.Assert.assertFalse
+import junit.framework.Assert.assertTrue
+import okhttp3.Cookie
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import org.junit.Test
+
+class CookieJarImplTest {
+
+    private val oldCookies = ArrayList<Cookie>().apply {
+        add(COOKIE_A)
+        add(COOKIE_B_OLD)
+    }
+
+    private val newCookies = ArrayList<Cookie>().apply {
+        add(COOKIE_B_NEW)
+    }
+
+    private val updatedCookies = ArrayList<Cookie>().apply {
+        add(COOKIE_A)
+        add(COOKIE_B_NEW)
+    }
+
+    private val cookieStore = HashMap<String, List<Cookie>>().apply {
+        put(SOME_HOST, oldCookies)
+    }
+
+    private val cookieJarImpl = CookieJarImpl(cookieStore)
+
+    @Test
+    fun testContainsCookieWithNameReturnsTrue() {
+        assertTrue(cookieJarImpl.containsCookieWithName(oldCookies, COOKIE_B_OLD.name))
+    }
+
+    @Test
+    fun testContainsCookieWithNameReturnsFalse() {
+        assertFalse(cookieJarImpl.containsCookieWithName(newCookies, COOKIE_A.name))
+    }
+
+    @Test
+    fun testGetUpdatedCookies() {
+        val generatedUpdatedCookies = cookieJarImpl.getUpdatedCookies(oldCookies, newCookies)
+        assertEquals(2, generatedUpdatedCookies.size)
+        assertEquals(updatedCookies[0], generatedUpdatedCookies[1])
+        assertEquals(updatedCookies[1], generatedUpdatedCookies[0])
+    }
+
+    @Test
+    fun testCookieStoreUpdateViaSaveFromResponse() {
+        cookieJarImpl.saveFromResponse(SOME_URL, newCookies)
+        val generatedUpdatedCookies = cookieStore[SOME_HOST]
+        assertEquals(2, generatedUpdatedCookies?.size)
+        assertEquals(updatedCookies[0], generatedUpdatedCookies?.get(1))
+        assertEquals(updatedCookies[1], generatedUpdatedCookies?.get(0))
+    }
+
+    @Test
+    fun testLoadForRequest() {
+        val cookies = cookieJarImpl.loadForRequest(SOME_URL)
+        assertEquals(oldCookies[0], cookies[0])
+        assertEquals(oldCookies[1], cookies[1])
+    }
+
+    companion object {
+        const val SOME_HOST = "some.host.com"
+        val SOME_URL = "https://$SOME_HOST".toHttpUrl()
+        val COOKIE_A = Cookie.parse(SOME_URL, "CookieA=CookieValueA")!!
+        val COOKIE_B_OLD = Cookie.parse(SOME_URL, "CookieB=CookieOldValueB")!!
+        val COOKIE_B_NEW = Cookie.parse(SOME_URL, "CookieB=CookieNewValueB")!!
+    }
+}
\ No newline at end of file