diff --git a/Contentstack/Config.h b/Contentstack/Config.h index f41bb61..b828898 100755 --- a/Contentstack/Config.h +++ b/Contentstack/Config.h @@ -88,4 +88,27 @@ */ @property (nullable, retain) id delegate; + + +/** + Early access features + + //Obj-C + Config *config = [[Config alloc] init]; + [config setEarlyAccess:@[@"Taxonomy", @"Teams", @"Terms", @"LivePreview"]]; + + //Swift + let config = Config() + config.setEarlyAccess(["Taxonomy", "Teams", "Terms", "LivePreview"]) + + */ +@property (nonatomic, strong, nullable) NSArray *setEarlyAccess; + + +/** + Set early access features + + @param setearlyAccess An array of early access feature names + */ +- (NSDictionary *)earlyAccessHeaders; @end diff --git a/Contentstack/Config.m b/Contentstack/Config.m index 2a42703..1dbde51 100755 --- a/Contentstack/Config.m +++ b/Contentstack/Config.m @@ -15,7 +15,8 @@ -(instancetype)init { if (self) { _region = US; _host = @"cdn.contentstack.io"; - _version = kCSIO_ApiVersion; + _version = kCSIO_ApiVersion; + _setEarlyAccess = nil; } return self; } @@ -25,4 +26,11 @@ - (void)setRegion:(ContentstackRegion)region { _host = [self hostURL:_region]; } } +- (NSDictionary *)earlyAccessHeaders { + if (_setEarlyAccess.count > 0) { + NSString *earlyAccessString = [_setEarlyAccess componentsJoinedByString:@","]; + return @{@"x-header-ea": earlyAccessString}; + } + return @{}; +} @end diff --git a/Contentstack/Stack.h b/Contentstack/Stack.h index 48ff064..08fdad6 100644 --- a/Contentstack/Stack.h +++ b/Contentstack/Stack.h @@ -68,6 +68,8 @@ BUILT_ASSUME_NONNULL_BEGIN - (Taxonomy *)taxonomy; +- (NSDictionary *)getHeaders; + //MARK: - Manually set headers /**--------------------------------------------------------------------------------------- * @name Manually set headers diff --git a/Contentstack/Stack.m b/Contentstack/Stack.m index ec23d84..edb1163 100644 --- a/Contentstack/Stack.m +++ b/Contentstack/Stack.m @@ -47,6 +47,11 @@ - (instancetype)initWithAPIKey:(NSString*)apiKey andaccessToken:(NSString *)acce _commonDateFormatter.includeTime = YES; _requestOperationSet = [NSMutableSet set]; + // Add early access headers only if they exist + NSDictionary *earlyAccessHeaders = [_config earlyAccessHeaders]; + if (earlyAccessHeaders.count > 0) { + [_stackHeaders addEntriesFromDictionary:earlyAccessHeaders]; + } [self setHeader:_apiKey forKey:kCSIO_SiteApiKey]; @@ -128,6 +133,10 @@ - (void)removeHeaderForKey:(NSString *)headerKey { } } +- (NSDictionary *)getHeaders { + return [self.stackHeaders copy]; +} + - (NSString *)imageTransformWithUrl:(NSString *)url andParams:(NSDictionary *)params{ if([url rangeOfString:@"?" options:NSCaseInsensitiveSearch].length==0) { url = [url stringByAppendingString:@"?"]; diff --git a/ContentstackTest/ContentstackTest.m b/ContentstackTest/ContentstackTest.m index bd85fe9..b804003 100644 --- a/ContentstackTest/ContentstackTest.m +++ b/ContentstackTest/ContentstackTest.m @@ -119,6 +119,61 @@ - (void)tearDown { #pragma mark Test Case - Header +- (void)testStackHeadersEarlyAccess { + XCTestExpectation *expectation = [self expectationWithDescription:@"EarlyAccessHeadersPassed"]; + config = [[Config alloc] init]; + config.setEarlyAccess = @[@"Taxonomy", @"Teams", @"Terms", @"LivePreview"]; + csStack = [Contentstack stackWithAPIKey:@"apikey" accessToken:@"delivery_token" environmentName:@"environment" config:config]; + // Check the headers in the stack + NSDictionary *headers = [csStack getHeaders]; + // Check if the early access headers are set correctly + NSString *expectedHeaderValue = @"Taxonomy,Teams,Terms,LivePreview"; + NSString *earlyAccessHeader = headers[@"x-header-ea"]; + + XCTAssertNotNil(earlyAccessHeader, @"Early access header should be present"); + XCTAssertEqualObjects(earlyAccessHeader, expectedHeaderValue, @"Early access header should match the expected value"); + + // Fulfill the expectation to mark the test as completed + [expectation fulfill]; + + // Wait for the request to complete + [self waitForExpectationsWithTimeout:kRequestTimeOutInSeconds handler:^(NSError *error) { + if (error) { + XCTFail(@"Test timed out: %@", error.localizedDescription); + } + }]; +} + +- (void)testNoEarlyAccessHeaders { + XCTestExpectation *expectation = [self expectationWithDescription:@"NoEarlyAccessHeaders"]; + config = [[Config alloc] init]; + csStack = [Contentstack stackWithAPIKey:@"apikey" accessToken:@"delivery_token" environmentName:@"environment" config:config]; + + NSDictionary *headers = [csStack getHeaders]; + NSString *earlyAccessHeader = headers[@"x-header-ea"]; + XCTAssertNil(earlyAccessHeader, @"Early access header should not be present when no early access features are set"); + + [expectation fulfill]; + [self waitForExpectationsWithTimeout:kRequestTimeOutInSeconds handler:nil]; +} + +- (void)testSingleEarlyAccessHeader { + XCTestExpectation *expectation = [self expectationWithDescription:@"SingleEarlyAccessHeader"]; + config = [[Config alloc] init]; + config.setEarlyAccess = @[@"LivePreview"]; + csStack = [Contentstack stackWithAPIKey:@"apikey" accessToken:@"delivery_token" environmentName:@"environment" config:config]; + + NSDictionary *headers = [csStack getHeaders]; + NSString *expectedHeaderValue = @"LivePreview"; + NSString *earlyAccessHeader = headers[@"x-header-ea"]; + XCTAssertNotNil(earlyAccessHeader, @"Early access header should be present"); + XCTAssertEqualObjects(earlyAccessHeader, expectedHeaderValue, @"Single early access header should match the expected value"); + + [expectation fulfill]; + [self waitForExpectationsWithTimeout:kRequestTimeOutInSeconds handler:nil]; +} + + - (void)test01FetchSourceEntries { XCTestExpectation *expectation = [self expectationWithDescription:@"Fetch All Entries"];