Skip to content
This repository was archived by the owner on Sep 30, 2025. It is now read-only.

Commit 4053621

Browse files
committed
Update the Accept-Language header values to include all languages
1 parent 4d45518 commit 4053621

File tree

7 files changed

+55
-110
lines changed

7 files changed

+55
-110
lines changed

SPTDataLoader.xcodeproj/project.pbxproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
059940A91A150C90006D6BE9 /* SPTDataLoaderResponseTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 059940A81A150C90006D6BE9 /* SPTDataLoaderResponseTest.m */; };
4444
05A3BCB61D649CC000735F87 /* SPTDataLoaderCancellationTokenFactoryMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 05A3BCB51D649CC000735F87 /* SPTDataLoaderCancellationTokenFactoryMock.m */; };
4545
05CB0C451A1A1E8A00CA4CEF /* SPTDataLoaderRequestTaskHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 05CB0C441A1A1E8A00CA4CEF /* SPTDataLoaderRequestTaskHandler.m */; };
46-
05EEB73F1C5C090B00A82266 /* NSBundleMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 05EEB73E1C5C090B00A82266 /* NSBundleMock.m */; };
46+
05EEB73F1C5C090B00A82266 /* NSLocaleMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 05EEB73E1C5C090B00A82266 /* NSLocaleMock.m */; };
4747
2DE3DAC72344E3DA0022642E /* SPTDataLoaderServiceSessionSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DE3DAC42344E3DA0022642E /* SPTDataLoaderServiceSessionSelector.m */; };
4848
2DE3DACA2344E5060022642E /* SPTDataLoaderServiceSessionSelectorMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DE3DAC92344E5060022642E /* SPTDataLoaderServiceSessionSelectorMock.m */; };
4949
3426C1ED24CB1C7B00B919B4 /* SPTDataLoaderBlockWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3426C1EC24CB1C7B00B919B4 /* SPTDataLoaderBlockWrapper.m */; };
@@ -196,8 +196,8 @@
196196
05C602FC1CCBBC5E00143BA4 /* spotify_os.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = spotify_os.xcconfig; path = ci/spotify_os.xcconfig; sourceTree = "<group>"; };
197197
05CB0C431A1A1E8A00CA4CEF /* SPTDataLoaderRequestTaskHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTDataLoaderRequestTaskHandler.h; sourceTree = "<group>"; };
198198
05CB0C441A1A1E8A00CA4CEF /* SPTDataLoaderRequestTaskHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTDataLoaderRequestTaskHandler.m; sourceTree = "<group>"; };
199-
05EEB73D1C5C090B00A82266 /* NSBundleMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSBundleMock.h; sourceTree = "<group>"; };
200-
05EEB73E1C5C090B00A82266 /* NSBundleMock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSBundleMock.m; sourceTree = "<group>"; };
199+
05EEB73D1C5C090B00A82266 /* NSLocaleMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSLocaleMock.h; sourceTree = "<group>"; };
200+
05EEB73E1C5C090B00A82266 /* NSLocaleMock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSLocaleMock.m; sourceTree = "<group>"; };
201201
2DE3DAC42344E3DA0022642E /* SPTDataLoaderServiceSessionSelector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTDataLoaderServiceSessionSelector.m; sourceTree = "<group>"; };
202202
2DE3DAC52344E3DA0022642E /* SPTDataLoaderServiceSessionSelector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTDataLoaderServiceSessionSelector.h; sourceTree = "<group>"; };
203203
2DE3DAC62344E3DA0022642E /* SPTDataLoaderService+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SPTDataLoaderService+Private.h"; sourceTree = "<group>"; };
@@ -496,8 +496,8 @@
496496
F5F63D9D2531320F000A07D1 /* Utilities */ = {
497497
isa = PBXGroup;
498498
children = (
499-
05EEB73D1C5C090B00A82266 /* NSBundleMock.h */,
500-
05EEB73E1C5C090B00A82266 /* NSBundleMock.m */,
499+
05EEB73D1C5C090B00A82266 /* NSLocaleMock.h */,
500+
05EEB73E1C5C090B00A82266 /* NSLocaleMock.m */,
501501
48E7EEC42059288E00BB7CCC /* NSDataMock.h */,
502502
48E7EEC52059288F00BB7CCC /* NSDataMock.m */,
503503
48E7EEC220591A2E00BB7CCC /* NSFileManagerMock.h */,
@@ -714,7 +714,7 @@
714714
isa = PBXSourcesBuildPhase;
715715
buildActionMask = 2147483647;
716716
files = (
717-
05EEB73F1C5C090B00A82266 /* NSBundleMock.m in Sources */,
717+
05EEB73F1C5C090B00A82266 /* NSLocaleMock.m in Sources */,
718718
059940431A14BA28006D6BE9 /* SPTDataLoaderRequestResponseHandlerMock.m in Sources */,
719719
48E7EEC62059288F00BB7CCC /* NSDataMock.m in Sources */,
720720
0599409F1A14F60F006D6BE9 /* SPTDataLoaderTest.m in Sources */,

Sources/SPTDataLoader/SPTDataLoaderRequest.m

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -129,43 +129,22 @@ + (NSString *)languageHeaderValue
129129

130130
+ (NSString *)generateLanguageHeaderValue
131131
{
132-
const NSInteger SPTDataLoaderRequestMaximumLanguages = 2;
133-
NSString * const SPTDataLoaderRequestEnglishLanguageValue = @"en";
134132
NSString * const SPTDataLoaderRequestLanguageHeaderValuesJoiner = @", ";
135133

136134
NSString *(^constructLanguageHeaderValue)(NSString *, double) = ^NSString *(NSString *language, double languageImportance) {
137135
NSString * const SPTDataLoaderRequestLanguageFormatString = @"%@;q=%.2f";
138136
return [NSString stringWithFormat:SPTDataLoaderRequestLanguageFormatString, language, languageImportance];
139137
};
140138

141-
NSArray<NSString *> *localizations = [NSBundle mainBundle].preferredLocalizations;
142-
NSMutableOrderedSet<NSString *> *languages = [NSMutableOrderedSet orderedSetWithArray:localizations];
143-
if (languages.count > SPTDataLoaderRequestMaximumLanguages) {
144-
const NSUInteger excess = languages.count - SPTDataLoaderRequestMaximumLanguages;
145-
[languages removeObjectsInRange:NSMakeRange(SPTDataLoaderRequestMaximumLanguages, excess)];
146-
}
147-
double languageImportanceCounter = 1.0;
139+
NSArray<NSString *> *languages = [NSLocale preferredLanguages];
140+
148141
NSMutableArray *languageHeaderValues = [NSMutableArray arrayWithCapacity:languages.count];
149-
BOOL containsEnglish = NO;
150-
for (NSString *language in languages) {
151-
if (!containsEnglish) {
152-
NSString * const SPTDataLoaderRequestLanguageLocaleSeparator = @"-";
153-
NSString *languageValue = [language componentsSeparatedByString:SPTDataLoaderRequestLanguageLocaleSeparator].firstObject;
154-
if ([languageValue isEqualToString:SPTDataLoaderRequestEnglishLanguageValue]) {
155-
containsEnglish = YES;
156-
}
157-
}
158142

159-
if (languageImportanceCounter == 1.0) {
160-
[languageHeaderValues addObject:language];
161-
} else {
162-
[languageHeaderValues addObject:constructLanguageHeaderValue(language, languageImportanceCounter)];
163-
}
164-
languageImportanceCounter -= (1.0 / languages.count);
165-
}
166-
if (!containsEnglish) {
167-
[languageHeaderValues addObject:constructLanguageHeaderValue(SPTDataLoaderRequestEnglishLanguageValue, 0.01)];
168-
}
143+
[languages enumerateObjectsUsingBlock:^(NSString *language, NSUInteger idx, BOOL *stop) {
144+
const double languageImportance = 1.0 - idx * (1.0 / languages.count);
145+
[languageHeaderValues addObject:constructLanguageHeaderValue(language, languageImportance)];
146+
}];
147+
169148
return [languageHeaderValues componentsJoinedByString:SPTDataLoaderRequestLanguageHeaderValuesJoiner];
170149
}
171150

Tests/SPTDataLoader/SPTDataLoaderRequestTest.m

Lines changed: 9 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#import <objc/runtime.h>
88

99
#import "SPTDataLoaderRequest+Private.h"
10-
#import "NSBundleMock.h"
10+
#import "NSLocaleMock.h"
1111

1212
@interface SPTDataLoaderRequest ()
1313

@@ -140,24 +140,24 @@ - (void)testCopy
140140
XCTAssertEqual(request.shouldStopRedirection, self.request.shouldStopRedirection, @"The stop redirection was not copied correctly");
141141
}
142142

143-
- (void)testAcceptLanguageWithNoEnglishLanguages
143+
- (void)testAcceptLanguage
144144
{
145-
NSBundleMock *bundleMock = [NSBundleMock new];
146-
bundleMock.mockPreferredLocalizations = @[ @"fr-CA", @"pt-PT", @"es-419" ];
145+
// When the language identifier does not contain a region designator, NSLocale uses the user's preferred region.
146+
[NSLocaleMock setPreferredLanguages:@[ @"en-US", @"fr-SE", @"ja-SE", @"sv-SE", @"mk-SE", @"nl-SE" ]];
147+
148+
Method originalMethod = class_getClassMethod(NSLocale.class, @selector(preferredLanguages));
149+
Method fakeMethod = class_getClassMethod(NSLocaleMock.class, @selector(preferredLanguages));
147150

148-
Method originalMethod = class_getClassMethod(NSBundle.class, @selector(mainBundle));
149151
IMP originalMethodImplementation = method_getImplementation(originalMethod);
152+
IMP fakeMethodImplementation = method_getImplementation(fakeMethod);
150153

151-
IMP fakeMethodImplementation = imp_implementationWithBlock(^ {
152-
return bundleMock;
153-
});
154154
method_setImplementation(originalMethod, fakeMethodImplementation);
155155

156156
NSString *languageValues = [SPTDataLoaderRequest generateLanguageHeaderValue];
157157

158158
method_setImplementation(originalMethod, originalMethodImplementation);
159159

160-
XCTAssertEqualObjects(@"fr-CA, pt-PT;q=0.50, en;q=0.01", languageValues);
160+
XCTAssertEqualObjects(@"en-US;q=1.00, fr-SE;q=0.83, ja-SE;q=0.67, sv-SE;q=0.50, mk-SE;q=0.33, nl-SE;q=0.17", languageValues);
161161
}
162162

163163
- (void)testDescription
@@ -170,46 +170,6 @@ - (void)testDescription
170170
@"The description should contain the URL of the request.");
171171
}
172172

173-
- (void)testAcceptLanguageWithMultipleLanguagesContainingEnglish
174-
{
175-
NSBundleMock *bundleMock = [NSBundleMock new];
176-
bundleMock.mockPreferredLocalizations = @[ @"fr-CA", @"en", @"pt-PT" ];
177-
178-
Method originalMethod = class_getClassMethod(NSBundle.class, @selector(mainBundle));
179-
IMP originalMethodImplementation = method_getImplementation(originalMethod);
180-
181-
IMP fakeMethodImplementation = imp_implementationWithBlock(^ {
182-
return bundleMock;
183-
});
184-
method_setImplementation(originalMethod, fakeMethodImplementation);
185-
186-
NSString *languageValues = [SPTDataLoaderRequest generateLanguageHeaderValue];
187-
188-
method_setImplementation(originalMethod, originalMethodImplementation);
189-
190-
XCTAssertEqualObjects(@"fr-CA, en;q=0.50", languageValues);
191-
}
192-
193-
- (void)testAcceptLanguageRemovesDuplicateLocalizations
194-
{
195-
NSBundleMock *bundleMock = [NSBundleMock new];
196-
bundleMock.mockPreferredLocalizations = @[ @"es-419", @"es-419", @"pt-PT" ];
197-
198-
Method originalMethod = class_getClassMethod(NSBundle.class, @selector(mainBundle));
199-
IMP originalMethodImplementation = method_getImplementation(originalMethod);
200-
201-
IMP fakeMethodImplementation = imp_implementationWithBlock(^ {
202-
return bundleMock;
203-
});
204-
method_setImplementation(originalMethod, fakeMethodImplementation);
205-
206-
NSString *languageValues = [SPTDataLoaderRequest generateLanguageHeaderValue];
207-
208-
method_setImplementation(originalMethod, originalMethodImplementation);
209-
210-
XCTAssertEqualObjects(@"es-419, pt-PT;q=0.50, en;q=0.01", languageValues);
211-
}
212-
213173
- (void)testDeleteMethod
214174
{
215175
self.request.method = SPTDataLoaderRequestMethodDelete;

Tests/SPTDataLoader/Utilities/NSBundleMock.h

Lines changed: 0 additions & 12 deletions
This file was deleted.

Tests/SPTDataLoader/Utilities/NSBundleMock.m

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
Copyright Spotify AB.
3+
SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#import <Foundation/Foundation.h>
7+
8+
@interface NSLocaleMock : NSLocale
9+
10+
+ (void)setPreferredLanguages:(NSArray<NSString *> *)languages;
11+
12+
@end
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
Copyright Spotify AB.
3+
SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#import "NSLocaleMock.h"
7+
8+
@implementation NSLocaleMock
9+
10+
static NSArray<NSString *> *_mockPreferredLanguages;
11+
12+
+ (NSArray<NSString *> *)preferredLanguages {
13+
return _mockPreferredLanguages;
14+
}
15+
16+
+ (void)setPreferredLanguages:(NSArray<NSString *> *)languages
17+
{
18+
_mockPreferredLanguages = languages;
19+
}
20+
21+
@end

0 commit comments

Comments
 (0)