From fcfae643c3478dfe2fdf31128af4feb8ef837063 Mon Sep 17 00:00:00 2001 From: Sean Nemann Date: Thu, 31 May 2018 11:28:56 -0400 Subject: [PATCH] Updated isUserBlocked method to check the expiration time instead of just if an expiration time exists. Updated tests accordingly --- .../mwapi/ApacheHttpClientMediaWikiApi.java | 16 ++++++++-- .../mwapi/ApacheHttpClientMediaWikiApiTest.kt | 29 ++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java index b78ad88ae..c24ee2f21 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java @@ -37,6 +37,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.TimeZone; import java.util.concurrent.Callable; import fr.free.nrw.commons.BuildConfig; @@ -630,8 +631,17 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi { .param("uiprop", "blockinfo") .get(); if(result != null) { - // the blockexpiry field will only be present if the user is currently blocked - userBlocked = !result.getString("/api/query/userinfo/@blockexpiry").isEmpty(); + String blockEnd = result.getString("/api/query/userinfo/@blockexpiry"); + if(blockEnd.equals("infinite")) + { + userBlocked = true; + } + else if (!blockEnd.isEmpty()) { + Date endDate = parseMWDate(blockEnd); + Date current = new Date(); + userBlocked = endDate.after(current); + } + } } catch (Exception e) { e.printStackTrace(); @@ -642,10 +652,12 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi { private Date parseMWDate(String mwDate) { SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH); // Assuming MW always gives me UTC + isoFormat.setTimeZone(TimeZone.getTimeZone("UTC")); try { return isoFormat.parse(mwDate); } catch (ParseException e) { throw new RuntimeException(e); } } + } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApiTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApiTest.kt index 6f630ce1a..eea86fd2f 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApiTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApiTest.kt @@ -18,6 +18,7 @@ import org.robolectric.RobolectricTestRunner import org.robolectric.RuntimeEnvironment import org.robolectric.annotation.Config import java.net.URLDecoder +import java.text.SimpleDateFormat import java.util.* @RunWith(RobolectricTestRunner::class) @@ -243,7 +244,11 @@ class ApacheHttpClientMediaWikiApiTest { @Test fun isUserBlockedForTimeBlockedUser() { - server.enqueue(MockResponse().setBody("")) + val currentDate = Date() + val expiredDate = Date(currentDate.time + 10000) + val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")) + server.enqueue(MockResponse().setBody("")) val result = testObject.isUserBlocked(); @@ -259,6 +264,28 @@ class ApacheHttpClientMediaWikiApiTest { assertTrue(result) } + @Test + fun isUserBlockedForExpiredBlockedUser() { + val currentDate = Date() + val expiredDate = Date(currentDate.time - 10000) + val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")) + server.enqueue(MockResponse().setBody("")) + + val result = testObject.isUserBlocked(); + + assertBasicRequestParameters(server, "GET").let { userBlockedRequest -> + parseQueryParams(userBlockedRequest).let { body -> + assertEquals("xml", body["format"]) + assertEquals("query", body["action"]) + assertEquals("userinfo", body["meta"]) + assertEquals("blockinfo", body["uiprop"]) + } + } + + assertFalse(result) + } + @Test fun isUserBlockedForNotBlockedUser() { server.enqueue(MockResponse().setBody(""))