Bgerstle has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/226923

Change subject: fix nil handling in langlink responses
......................................................................

fix nil handling in langlink responses

When we get a response from langlinks where the langlinks field is
absent (instead of empty) for a given page, we need to gracefully return
an empty array.

Bug: T106853
Change-Id: I778fc261e1a77a92b653d90782e885c01e67d464
---
M Wikipedia.xcodeproj/project.pbxproj
M Wikipedia/Networking/Fetchers/MWKLanguageLinkFetcher.m
M Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.h
M Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.m
M Wikipedia/Networking/Serializers/WMFApiJsonResponseSerializer.m
A WikipediaUnitTests/MWKLanguageLinkResponseSerializerTests.m
6 files changed, 50 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia 
refs/changes/23/226923/1

diff --git a/Wikipedia.xcodeproj/project.pbxproj 
b/Wikipedia.xcodeproj/project.pbxproj
index 48f6477..1442d21 100644
--- a/Wikipedia.xcodeproj/project.pbxproj
+++ b/Wikipedia.xcodeproj/project.pbxproj
@@ -245,6 +245,7 @@
                BC69C3141AB0C1FF0090B039 /* WMFImageInfoController.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = BC69C3131AB0C1FF0090B039 /* 
WMFImageInfoController.m */; };
                BC6BF4001B19213600362968 /* XCTestCase+WMFLocaleTesting.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BC6BF3FE1B19209900362968 /* 
XCTestCase+WMFLocaleTesting.m */; };
                BC725ECF1B628C0300E0A64C /* 
NSParagraphStyle+WMFParagraphStyles.m in Sources */ = {isa = PBXBuildFile; 
fileRef = BC725ECE1B628C0300E0A64C /* NSParagraphStyle+WMFParagraphStyles.m */; 
};
+               BC725ED21B62DADD00E0A64C /* 
MWKLanguageLinkResponseSerializerTests.m in Sources */ = {isa = PBXBuildFile; 
fileRef = BC725ED11B62DADD00E0A64C /* MWKLanguageLinkResponseSerializerTests.m 
*/; };
                BC7DFCD61AA4E5FE000035C3 /* WMFImageURLParsing.m in Sources */ 
= {isa = PBXBuildFile; fileRef = BC7DFCD51AA4E5FE000035C3 /* 
WMFImageURLParsing.m */; };
                BC7E4A521B34B53E00EECD8B /* MWKLanguageLinkControllerTests.m in 
Sources */ = {isa = PBXBuildFile; fileRef = BC7E4A511B34B53E00EECD8B /* 
MWKLanguageLinkControllerTests.m */; };
                BC86B9361A92966B00B4C039 /* 
AFHTTPRequestOperationManager+UniqueRequests.m in Sources */ = {isa = 
PBXBuildFile; fileRef = BC86B9351A92966B00B4C039 /* 
AFHTTPRequestOperationManager+UniqueRequests.m */; };
@@ -799,6 +800,7 @@
                BC6FEAE01A9B7EFD00A1D890 /* WMFCodingStyle.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= WMFCodingStyle.m; sourceTree = "<group>"; };
                BC725ECD1B628C0300E0A64C /* 
NSParagraphStyle+WMFParagraphStyles.h */ = {isa = PBXFileReference; 
fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
"NSParagraphStyle+WMFParagraphStyles.h"; sourceTree = "<group>"; };
                BC725ECE1B628C0300E0A64C /* 
NSParagraphStyle+WMFParagraphStyles.m */ = {isa = PBXFileReference; 
fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = 
"NSParagraphStyle+WMFParagraphStyles.m"; sourceTree = "<group>"; };
+               BC725ED11B62DADD00E0A64C /* 
MWKLanguageLinkResponseSerializerTests.m */ = {isa = PBXFileReference; 
fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = 
MWKLanguageLinkResponseSerializerTests.m; sourceTree = "<group>"; };
                BC7A4A231B17B3510003E73E /* NSObjectUtilities.h */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.c.h; path = 
NSObjectUtilities.h; sourceTree = "<group>"; };
                BC7ACB621AB34C9C00791497 /* WMFAsyncTestCase.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = 
WMFAsyncTestCase.h; path = ../WMFAsyncTestCase.h; sourceTree = "<group>"; };
                BC7ACB631AB34C9C00791497 /* WMFAsyncTestCase.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name 
= WMFAsyncTestCase.m; path = ../WMFAsyncTestCase.m; sourceTree = "<group>"; };
@@ -2152,6 +2154,7 @@
                                BC092BA61B19189100093C59 /* 
MWKSiteInfoFetcherTests.m */,
                                BC7E4A511B34B53E00EECD8B /* 
MWKLanguageLinkControllerTests.m */,
                                BC905BCF1B60391F0010227E /* 
MWKLanguageLinkFetcherTests.m */,
+                               BC725ED11B62DADD00E0A64C /* 
MWKLanguageLinkResponseSerializerTests.m */,
                        );
                        name = Tests;
                        path = WikipediaUnitTests;
@@ -2997,6 +3000,7 @@
                                04F1226A1ACB822D002FC3B5 /* 
NSString+FormattedAttributedStringTests.m in Sources */,
                                BCCED2D01AE03BE20094EB7E /* 
MWKSectionListTests.m in Sources */,
                                BC7E4A521B34B53E00EECD8B /* 
MWKLanguageLinkControllerTests.m in Sources */,
+                               BC725ED21B62DADD00E0A64C /* 
MWKLanguageLinkResponseSerializerTests.m in Sources */,
                                BC0FED6B1AAA0268002488D7 /* 
MWKDataStoreStorageTests.m in Sources */,
                                0484B9071ABB50FA00874073 /* WMFArticleParsing.m 
in Sources */,
                                BC0FED751AAA026C002488D7 /* 
NSArray+BKIndexTests.m in Sources */,
diff --git a/Wikipedia/Networking/Fetchers/MWKLanguageLinkFetcher.m 
b/Wikipedia/Networking/Fetchers/MWKLanguageLinkFetcher.m
index 9ca0eef..0ee3f7d 100644
--- a/Wikipedia/Networking/Fetchers/MWKLanguageLinkFetcher.m
+++ b/Wikipedia/Networking/Fetchers/MWKLanguageLinkFetcher.m
@@ -72,10 +72,10 @@
            parameters:params
               success:^(AFHTTPRequestOperation* operation, NSDictionary* 
indexedLanguageLinks) {
         [[MWNetworkActivityIndicatorManager sharedManager] pop];
-        NSArray* languageLinksForTitle = [[indexedLanguageLinks allValues] 
firstObject];
-        NSAssert(languageLinksForTitle,
-                 @"Expected language links to return one object for the title 
we fetched, but got: %@",
+        NSAssert(indexedLanguageLinks.count < 2,
+                 @"Expected language links to return one or no objects for the 
title we fetched, but got: %@",
                  indexedLanguageLinks);
+        NSArray* languageLinksForTitle = [[indexedLanguageLinks allValues] 
firstObject];
         [self finishWithError:nil fetchedData:languageLinksForTitle 
block:success];
     } failure:^(AFHTTPRequestOperation* operation, NSError* error) {
         [[MWNetworkActivityIndicatorManager sharedManager] pop];
diff --git 
a/Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.h 
b/Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.h
index abe6bcd..0554dd1 100644
--- a/Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.h
+++ b/Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.h
@@ -8,7 +8,12 @@
 
 #import "WMFApiJsonResponseSerializer.h"
 
-/// Serializer which parses langlink query responses into @c MWKLanguageLink 
objects.
+/**
+ * Converts langlink query responses into the form of 
`[String:[MWKLanguageLink]]` where the string
+ * is a pageID.
+ *
+ * Keeping the response in the indexed form allows future support of querying 
multiple titles at once.
+ */
 @interface MWKLanguageLinkResponseSerializer : WMFApiJsonResponseSerializer
 
 @end
diff --git 
a/Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.m 
b/Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.m
index 8debe78..43e5988 100644
--- a/Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.m
+++ b/Wikipedia/Networking/Serializers/MWKLanguageLinkResponseSerializer.m
@@ -18,13 +18,15 @@
         return nil;
     }
     NSDictionary* pagesByID = json[@"query"][@"pages"];
-    return [pagesByID bk_map:^id (id key, NSDictionary* result) {
+    return [[pagesByID bk_map:^id (id key, NSDictionary* result) {
         return [result[@"langlinks"] bk_map:^MWKLanguageLink*(NSDictionary* 
jsonLink) {
             return [[MWKLanguageLink alloc] 
initWithLanguageCode:jsonLink[@"lang"]
                                                    pageTitleText:jsonLink[@"*"]
                                                             
name:jsonLink[@"autonym"]
                                                    
localizedName:jsonLink[@"langname"]];
         }];
+    }] bk_reject:^BOOL (id key, id obj) {
+        return WMF_IS_EQUAL(obj, [NSNull null]);
     }];
 }
 
diff --git a/Wikipedia/Networking/Serializers/WMFApiJsonResponseSerializer.m 
b/Wikipedia/Networking/Serializers/WMFApiJsonResponseSerializer.m
index 7d5832a..2063bdb 100644
--- a/Wikipedia/Networking/Serializers/WMFApiJsonResponseSerializer.m
+++ b/Wikipedia/Networking/Serializers/WMFApiJsonResponseSerializer.m
@@ -15,7 +15,7 @@
                            data:(NSData*)data
                           error:(NSError* __autoreleasing*)error {
     NSDictionary* json = [super responseObjectForResponse:response data:data 
error:error];
-    if (!json || *error) {
+    if (!json) {
         return nil;
     }
     NSDictionary* apiError = json[@"error"];
diff --git a/WikipediaUnitTests/MWKLanguageLinkResponseSerializerTests.m 
b/WikipediaUnitTests/MWKLanguageLinkResponseSerializerTests.m
new file mode 100644
index 0000000..fb58f27
--- /dev/null
+++ b/WikipediaUnitTests/MWKLanguageLinkResponseSerializerTests.m
@@ -0,0 +1,33 @@
+//
+//  MWKLanguageLinkResponseSerializerTests.m
+//  Wikipedia
+//
+//  Created by Brian Gerstle on 7/24/15.
+//  Copyright (c) 2015 Wikimedia Foundation. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import <XCTest/XCTest.h>
+#import "MWKLanguageLinkResponseSerializer.h"
+
+@interface MWKLanguageLinkResponseSerializerTests : XCTestCase
+
+@end
+
+@implementation MWKLanguageLinkResponseSerializerTests
+
+- (void)testNullHandling {
+    MWKLanguageLinkResponseSerializer* serializer = 
[MWKLanguageLinkResponseSerializer serializer];
+    NSDictionary* badResponse                     = @{
+        @"query": @{
+            @"pages": @{
+                @"fakePageId": @{} //< empty language link object
+            }
+        }
+    };
+    NSData* badResponseData = [NSJSONSerialization 
dataWithJSONObject:badResponse options:0 error:nil];
+    id serializedResponse   = [serializer responseObjectForResponse:nil 
data:badResponseData error:nil];
+    XCTAssertEqualObjects(serializedResponse, (@{ }));
+}
+
+@end

-- 
To view, visit https://gerrit.wikimedia.org/r/226923
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I778fc261e1a77a92b653d90782e885c01e67d464
Gerrit-PatchSet: 1
Gerrit-Project: apps/ios/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Bgerstle <bgers...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to