Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ let package = Package(
],
targets: [
.target(name: "OnLaunch"),
//dev .testTarget(name: "OnLaunchTests", dependencies: ["OnLaunch"]),
.testTarget(name: "OnLaunchTests", dependencies: ["OnLaunch"]),
]
)
20 changes: 10 additions & 10 deletions Sources/OnLaunch/Models/RequestContext.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@ import Foundation
struct RequestContext {
let bundleId: String?
let bundleVersion: String?
let releaseVersion: String?
let locale: String
let localeLanguageCode: String?
let localeRegionCode: String?
let platformName: String
let platformVersion: String
let releaseVersion: String?

func applyTo(request: inout URLRequest) {
if let bundleId = bundleId {
request.setValue(bundleId, forHTTPHeaderField: "X-ONLAUNCH-BUNDLE-ID")
}
if let bundleVersion = bundleVersion {
request.setValue(bundleVersion, forHTTPHeaderField: "X-ONLAUNCH-BUNDLE-VERSION")
}
if let releaseVersion = releaseVersion {
request.setValue(releaseVersion, forHTTPHeaderField: "X-ONLAUNCH-RELEASE-VERSION")
}
request.setValue(bundleId, forHTTPHeaderField: "X-ONLAUNCH-BUNDLE-ID")
request.setValue(bundleVersion, forHTTPHeaderField: "X-ONLAUNCH-BUNDLE-VERSION")
request.setValue(locale, forHTTPHeaderField: "X-ONLAUNCH-LOCALE")
request.setValue(localeLanguageCode, forHTTPHeaderField: "X-ONLAUNCH-LOCALE-LANGUAGE-CODE")
request.setValue(localeRegionCode, forHTTPHeaderField: "X-ONLAUNCH-LOCALE-REGION-CODE")
request.setValue(platformName, forHTTPHeaderField: "X-ONLAUNCH-PLATFORM-NAME")
request.setValue(platformVersion, forHTTPHeaderField: "X-ONLAUNCH-PLATFORM-VERSION")
request.setValue(releaseVersion, forHTTPHeaderField: "X-ONLAUNCH-RELEASE-VERSION")
}
}
8 changes: 6 additions & 2 deletions Sources/OnLaunch/OnLaunch.swift
Original file line number Diff line number Diff line change
Expand Up @@ -177,12 +177,16 @@ public class OnLaunch: NSObject {
request.setValue(options.publicKey, forHTTPHeaderField: "X-API-Key")

// Set the request context for server-side rule evaluation
let locale = Locale.autoupdatingCurrent
let context = RequestContext(
bundleId: options.bundleId ?? Bundle.main.bundleIdentifier,
bundleVersion: options.bundleVersion ?? Bundle.main.infoDictionary?["CFBundleVersion"] as? String,
releaseVersion: options.releaseVersion ?? Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String,
locale: locale.identifier,
localeLanguageCode: locale.languageCode,
localeRegionCode: locale.regionCode,
platformName: UIDevice.current.systemName,
platformVersion: UIDevice.current.systemVersion
platformVersion: UIDevice.current.systemVersion,
releaseVersion: options.releaseVersion ?? Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
)
context.applyTo(request: &request)

Expand Down
182 changes: 161 additions & 21 deletions Tests/OnLaunchTests/RequestContextTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@
import XCTest

final class RequestContextTests: XCTestCase {
// MARK: - Bundle ID

func testApplyTo_bundleIdIsNotDefined_headerShouldNotBeSet() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
releaseVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: ""
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
Expand All @@ -25,9 +30,12 @@ final class RequestContextTests: XCTestCase {
let context = RequestContext(
bundleId: "BUNDLE ID",
bundleVersion: nil,
releaseVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: ""
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
Expand All @@ -36,15 +44,20 @@ final class RequestContextTests: XCTestCase {
XCTAssertEqual(value, "BUNDLE ID")
}

// MARK: - Bundle Version

func testApplyTo_bundleVersionIsNotDefined_headerShouldNotBeSet() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
releaseVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: ""
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
Expand All @@ -59,9 +72,12 @@ final class RequestContextTests: XCTestCase {
let context = RequestContext(
bundleId: nil,
bundleVersion: "BUNDLE VERSION",
releaseVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: ""
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
Expand All @@ -70,49 +86,126 @@ final class RequestContextTests: XCTestCase {
XCTAssertEqual(value, "BUNDLE VERSION")
}

func testApplyTo_releaseVersionIsNotDefined_headerShouldNotBeSet() throws {
// MARK: - Locale

func testApplyTo_localeShouldBeSetInHeader() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
releaseVersion: nil,
locale: "LOCALE",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: ""
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
// -- Assert --
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-RELEASE-VERSION")
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-LOCALE")
XCTAssertEqual(value, "LOCALE")
}

// MARK: - Locale Language Code

func testApplyTo_localeLanguageCodeIsNotDefined_headerShouldNotBeSet() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
// -- Assert --
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-LOCALE-LANGUAGE-CODE")
XCTAssertNil(value)
}

func testApplyTo_releaseVersionIsDefined_headerShouldBeSet() throws {
func testApplyTo_localeLanguageCodeIsDefined_headerShouldBeSet() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: "",
locale: "",
localeLanguageCode: "en",
localeRegionCode: nil,
platformName: "",
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
// -- Assert --
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-LOCALE-LANGUAGE-CODE")
XCTAssertEqual(value, "en")
}

// MARK: - Locale Region Code

func testApplyTo_localeRegionCodeIsNotDefined_headerShouldNotBeSet() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
releaseVersion: "RELEASE VERSION",
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: ""
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
// -- Assert --
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-RELEASE-VERSION")
XCTAssertEqual(value, "RELEASE VERSION")
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-BUNDLE-VERSION")
XCTAssertNil(value)
}

func testApplyTo_localeRegionCodeIsDefined_headerShouldBeSet() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: "AT",
platformName: "",
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
// -- Assert --
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-LOCALE-REGION-CODE")
XCTAssertEqual(value, "AT")
}

// MARK: - Platform Name

func testApplyTo_platformNameShouldBeSetInHeader() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
releaseVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "PLATFORM NAME",
platformVersion: ""
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
Expand All @@ -121,20 +214,67 @@ final class RequestContextTests: XCTestCase {
XCTAssertEqual(value, "PLATFORM NAME")
}

// MARK: - Platform Version

func testApplyTo_platformVersionShouldBeSetInHeader() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
releaseVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: "PLATFORM VERSION"
platformVersion: "PLATFORM VERSION",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
// -- Assert --
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-PLATFORM-VERSION")
XCTAssertEqual(value, "PLATFORM VERSION")
}

// MARK: - Release Version

func testApplyTo_releaseVersionIsNotDefined_headerShouldNotBeSet() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: "",
releaseVersion: nil
)
// -- Act ---
context.applyTo(request: &request)
// -- Assert --
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-RELEASE-VERSION")
XCTAssertNil(value)
}

func testApplyTo_releaseVersionIsDefined_headerShouldBeSet() throws {
// -- Arrange --
var request = URLRequest(url: URL(string: "http://testing.local")!)
let context = RequestContext(
bundleId: nil,
bundleVersion: nil,
locale: "",
localeLanguageCode: nil,
localeRegionCode: nil,
platformName: "",
platformVersion: "",
releaseVersion: "RELEASE VERSION"
)
// -- Act ---
context.applyTo(request: &request)
// -- Assert --
let value = request.value(forHTTPHeaderField: "X-ONLAUNCH-RELEASE-VERSION")
XCTAssertEqual(value, "RELEASE VERSION")
}
}