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