diff --git a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift index bf18797..23b104a 100644 --- a/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift +++ b/SampleFiles/Tags/Generated/Analytics+GenAllScript.swift @@ -127,7 +127,7 @@ class AnalyticsManager { // MARK: - Methods - func setAnalyticsEnabled(_ enable: Bool) { + func setAnalyticsEnabled(_ enable: Bool) { isEnabled = enable } @@ -167,24 +167,30 @@ class AnalyticsManager { } } - // MARK: - Introduction + // MARK: - section_one - func logScreenIntroductionScreen(title: String) { + func logScreenS1DefOne() { logScreen( - name: "Bienvenue \(title)", - path: "introduction/" + name: "s1 def one", + path: "s1_def_one/" ) } - func logEventIntroductionScreen(test: String, data: Int) { + func logEventS1DefTwo() { logEvent( - name: "Bienvenue", - action: "action", - category: "category", - params: [ - "test": test, - "data": data - ] + name: "s1 def two", + action: "test", + category: "test", + params: [] + ) + } + + // MARK: - section_two + + func logScreenS2DefOne() { + logScreen( + name: "s2 def one", + path: "s2_def_one/" ) } } diff --git a/SampleFiles/Tags/sampleTags.yml b/SampleFiles/Tags/sampleTags.yml index 4933909..310acb4 100644 --- a/SampleFiles/Tags/sampleTags.yml +++ b/SampleFiles/Tags/sampleTags.yml @@ -1,24 +1,43 @@ --- categories: - - id: Introduction + - id: section_one screens: - - id: introduction_screen - name: Bienvenue _TITLE_ - path: introduction/ - tags: droid,ios - parameters: - - name: title - type: String - replaceIn: name + - id: s1_def_one + name: s1 def one + path: s1_def_one/ + tags: ios events: - - id: introduction_screen - name: Bienvenue - category: category - action: action - tags: droid,ios - parameters: - - name: test - type: String - - name: data - type: Int + - id: s1_def_two + name: s1 def two + action: test + category: test + tags: ios + + - id: section_two + screens: + - id: s2_def_one + name: s2 def one + path: s2_def_one/ + tags: ios + + events: + - id: s2_def_two + name: s2 def two + action: test + category: test + tags: droid + + - id: section_three + screens: + - id: s3_def_one + name: s3 def one + path: s3_def_one/ + tags: droid + + events: + - id: s3_def_two + name: s3 def two + action: test + category: test + tags: droid diff --git a/SampleFiles/genAllRessources.sh b/SampleFiles/genAllRessources.sh index bd96019..fc001fd 100755 --- a/SampleFiles/genAllRessources.sh +++ b/SampleFiles/genAllRessources.sh @@ -32,7 +32,7 @@ FORCE_FLAG="$1" #echo "\n-------------------------\n" -# Strings +## Strings #swift run -c release ResgenSwift strings stringium $FORCE_FLAG "./Strings/sampleStrings.txt" \ # --output-path "./Strings/Generated" \ # --langs "fr en en-us" \ @@ -41,23 +41,23 @@ FORCE_FLAG="$1" # --extension-name "String" \ # --extension-suffix "GenAllScript" -echo "\n-------------------------\n" - -## Tags -swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/sampleTags.txt" \ - --lang "ium" \ - --extension-output-path "./Tags/Generated" \ - --extension-name "Tags" \ - --extension-suffix "GenAllScript" -# #echo "\n-------------------------\n" -## Analytics -#swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/sampleTags.yml" \ -# --target "matomo firebase" \ +## Tags +#swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/sampleTags.txt" \ +# --lang "ium" \ # --extension-output-path "./Tags/Generated" \ -# --extension-name "Analytics" \ +# --extension-name "Tags" \ # --extension-suffix "GenAllScript" +# +echo "\n-------------------------\n" + +# Analytics +swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/sampleTags.yml" \ + --target "matomo firebase" \ + --extension-output-path "./Tags/Generated" \ + --extension-name "Analytics" \ + --extension-suffix "GenAllScript" echo "\n-------------------------\n" # diff --git a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift index f16f2ef..3da67c4 100644 --- a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift @@ -22,8 +22,6 @@ class AnalyticsGenerator { } } - - // Get extension content let extensionFileContent = Self.getExtensionContent(sections: sections, tags: tags, @@ -84,7 +82,7 @@ class AnalyticsGenerator { // MARK: - Methods - func setAnalyticsEnabled(_ enable: Bool) { + func setAnalyticsEnabled(_ enable: Bool) { isEnabled = enable } """ diff --git a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift index 0992aed..7b57d17 100644 --- a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift +++ b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift @@ -91,16 +91,16 @@ class AnalyticsFileParser { parameters: screen.parameters ) - guard target.contains(Analytics.TargetType.matomo.value) else { continue } + if target.contains(Analytics.TargetType.matomo.value) { + // Path + + guard let path = screen.path else { + let error = GenerateError.missingElement("screen path") + Generate.exit(withError: error) + } - // Path - - guard let path = screen.path else { - let error = GenerateError.missingElement("screen path") - Generate.exit(withError: error) + definition.path = path } - - definition.path = path definitions.append(definition) } @@ -121,25 +121,25 @@ class AnalyticsFileParser { parameters: event.parameters ) - guard target.contains(Analytics.TargetType.matomo.value) else { continue } - - // Category - - guard let category = event.category else { - let error = GenerateError.missingElement("event category") - Generate.exit(withError: error) + if target.contains(Analytics.TargetType.matomo.value) { + // Category + + guard let category = event.category else { + let error = GenerateError.missingElement("event category") + Generate.exit(withError: error) + } + + definition.category = category + + // Action + + guard let action = event.action else { + let error = GenerateError.missingElement("event action") + Generate.exit(withError: error) + } + + definition.action = action } - - definition.category = category - - // Action - - guard let action = event.action else { - let error = GenerateError.missingElement("event action") - Generate.exit(withError: error) - } - - definition.action = action definitions.append(definition) } diff --git a/Tests/ResgenSwiftTests/Analytics/AnalyticsDefinitionTests.swift b/Tests/ResgenSwiftTests/Analytics/AnalyticsDefinitionTests.swift index bbf451d..756f79e 100644 --- a/Tests/ResgenSwiftTests/Analytics/AnalyticsDefinitionTests.swift +++ b/Tests/ResgenSwiftTests/Analytics/AnalyticsDefinitionTests.swift @@ -52,15 +52,18 @@ final class AnalyticsDefinitionTests: XCTestCase { func testGeneratedRawPropertyScreen() { // Given let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .screen) - + definition.path = "ecran_un/" // When let propertyScreen = definition.getProperty() // Expect let expectScreen = """ - func logScreenEcranUn() { - logScreen(name: "Ecran un", path: "ecran_un/") + func logScreenDefinitionName() { + logScreen( + name: "Ecran un", + path: "ecran_un/" + ) } """ @@ -69,15 +72,20 @@ final class AnalyticsDefinitionTests: XCTestCase { func testGeneratedRawPropertyEvent() { // Given - let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .screen) + let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .event) // When let propertyEvent = definition.getProperty() // Expect let expectEvent = """ - func logEventEcranUn() { - logEvent(name: "Ecran un") + func logEventDefinitionName() { + logEvent( + name: "Ecran un", + action: "", + category: "", + params: [] + ) } """ @@ -87,14 +95,18 @@ final class AnalyticsDefinitionTests: XCTestCase { func testGeneratedRawStaticPropertyScreen() { // Given let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .screen) + definition.path = "ecran_un/" // When let propertyScreen = definition.getStaticProperty() // Expect let expectScreen = """ - static func logScreenEcranUn() { - logScreen(name: "Ecran un", path: "ecran_un/") + static func logScreenDefinitionName() { + logScreen( + name: "Ecran un", + path: "ecran_un/" + ) } """ @@ -103,15 +115,20 @@ final class AnalyticsDefinitionTests: XCTestCase { func testGeneratedRawStaticPropertyEvent() { // Given - let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .screen) + let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .event) // When let propertyEvent = definition.getStaticProperty() // Expect let expectEvent = """ - static func logEventEcranUn() { - logEvent(name: "Ecran un") + static func logEventDefinitionName() { + logEvent( + name: "Ecran un", + action: "", + category: "", + params: [] + ) } """ diff --git a/Tests/ResgenSwiftTests/Analytics/AnalyticsGeneratorTests.swift b/Tests/ResgenSwiftTests/Analytics/AnalyticsGeneratorTests.swift index 3978476..88f9883 100644 --- a/Tests/ResgenSwiftTests/Analytics/AnalyticsGeneratorTests.swift +++ b/Tests/ResgenSwiftTests/Analytics/AnalyticsGeneratorTests.swift @@ -13,9 +13,20 @@ import ToolCore final class AnalyticsGeneratorTests: XCTestCase { - private func getAnalyticsDefinition(id: String, path: String, name: String, type: AnalyticsDefinition.TagType, tags: [String]) -> AnalyticsDefinition { + private func getAnalyticsDefinition( + id: String, + path: String = "", + action: String = "", + category: String = "", + name: String, + type: AnalyticsDefinition.TagType, + tags: [String] + ) -> AnalyticsDefinition { let definition = AnalyticsDefinition(id: id, name: name, type: type) definition.tags = tags + definition.path = path + definition.action = action + definition.category = category return definition } @@ -23,20 +34,20 @@ final class AnalyticsGeneratorTests: XCTestCase { // Given let sectionOne = AnalyticsCategory(id: "section_one") sectionOne.definitions = [ - getAnalyticsDefinition(id: "s1_def_one", path: "s1_def_one/", name: "s1 def one", type: AnalyticsDefinition.TagType.screen, tags: ["ios", "iosonly"]), - getAnalyticsDefinition(id: "s1_def_two", path: "s1_def_two/", name: "s1 def two", type: AnalyticsDefinition.TagType.event, tags: ["ios", "iosonly"]), + getAnalyticsDefinition(id: "s1_def_one", name: "s1 def one", type: .screen, tags: ["ios", "iosonly"]), + getAnalyticsDefinition(id: "s1_def_two", name: "s1 def two", type: .event, tags: ["ios", "iosonly"]), ] let sectionTwo = AnalyticsCategory(id: "section_two") sectionTwo.definitions = [ - getAnalyticsDefinition(id: "s2_def_one", path: "s2_def_one/", name: "s2 def one", type: AnalyticsDefinition.TagType.screen, tags: ["ios","iosonly"]), - getAnalyticsDefinition(id: "s2_def_two", path: "s2_def_two/", name: "s2 def two", type: AnalyticsDefinition.TagType.event, tags: ["droid","droidonly"]), + getAnalyticsDefinition(id: "s2_def_one", name: "s2 def one", type: .screen, tags: ["ios","iosonly"]), + getAnalyticsDefinition(id: "s2_def_two", name: "s2 def two", type: .event, tags: ["droid","droidonly"]), ] let sectionThree = AnalyticsCategory(id: "section_three") sectionThree.definitions = [ - getAnalyticsDefinition(id: "s3_def_one", path: "s3_def_one/", name: "s3 def one", type: AnalyticsDefinition.TagType.screen, tags: ["droid","droidonly"]), - getAnalyticsDefinition(id: "s3_def_two", path: "s3_def_two/", name: "s3 def two", type: AnalyticsDefinition.TagType.event, tags: ["droid","droidonly"]), + getAnalyticsDefinition(id: "s3_def_one", name: "s3 def one", type: .screen, tags: ["droid","droidonly"]), + getAnalyticsDefinition(id: "s3_def_two", name: "s3 def two", type: .event, tags: ["droid","droidonly"]), ] // When @@ -49,29 +60,55 @@ final class AnalyticsGeneratorTests: XCTestCase { let expect = """ // Generated by ResgenSwift.Analytics 1.2 - import UIKit import Firebase // MARK: - Protocol protocol AnalyticsManagerProtocol { func logScreen(name: String, path: String) - func logEvent(name: String) + func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) } // MARK: - Firebase class FirebaseAnalyticsManager: AnalyticsManagerProtocol { func logScreen(name: String, path: String) { - Analytics.logEvent(AnalyticsEventScreenView, parameters: [AnalyticsParameterScreenName: name]) + var parameters = [ + AnalyticsParameterScreenName: name + ] + + Analytics.logEvent( + AnalyticsEventScreenView, + parameters: parameters + ) } - func logEvent(name: String) { - var parameters = [ - AnalyticsParameterValue: name + func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) { + var parameters: [String:Any] = [ + "action": action, + "category": category, ] + + if let supplementaryParameters = params { + parameters.merge(supplementaryParameters) { (origin, new) -> Any in + return origin + } + } - Analytics.logEvent(AnalyticsEventSelectContent, parameters: parameters) + Analytics.logEvent( + name, + parameters: parameters + ) } } @@ -88,7 +125,9 @@ final class AnalyticsGeneratorTests: XCTestCase { // MARK: - Methods - func setAnalyticsEnabled(_ enable: Bool) { isEnabled = enable } + func setAnalyticsEnabled(_ enable: Bool) { + isEnabled = enable + } func configure() { managers.append(FirebaseAnalyticsManager()) @@ -96,32 +135,55 @@ final class AnalyticsGeneratorTests: XCTestCase { private func logScreen(name: String, path: String) { guard isEnabled else { return } + managers.forEach { manager in manager.logScreen(name: name, path: path) } } - private func logEvent(name: String) { + private func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) { guard isEnabled else { return } + managers.forEach { manager in - manager.logEvent(name: name) + manager.logEvent( + name: name, + action: action, + category: category, + params: params + ) } } // MARK: - section_one func logScreenS1DefOne() { - logScreen(name: "s1 def one", path: "s1_def_one/") + logScreen( + name: "s1 def one", + path: "" + ) } func logEventS1DefTwo() { - logEvent(name: "s1 def two") + logEvent( + name: "s1 def two", + action: "", + category: "", + params: [] + ) } - + // MARK: - section_two func logScreenS2DefOne() { - logScreen(name: "s2 def one", path: "s2_def_one/") + logScreen( + name: "s2 def one", + path: "" + ) } } @@ -137,20 +199,20 @@ final class AnalyticsGeneratorTests: XCTestCase { // Given let sectionOne = AnalyticsCategory(id: "section_one") sectionOne.definitions = [ - getAnalyticsDefinition(id: "s1_def_one", path: "s1_def_one/", name: "s1 def one", type: AnalyticsDefinition.TagType.screen, tags: ["ios", "iosonly"]), - getAnalyticsDefinition(id: "s1_def_two", path: "s1_def_two/", name: "s1 def two", type: AnalyticsDefinition.TagType.event, tags: ["ios", "iosonly"]), + getAnalyticsDefinition(id: "s1_def_one", path: "s1_def_one/", name: "s1 def one", type: .screen, tags: ["ios", "iosonly"]), + getAnalyticsDefinition(id: "s1_def_two", action: "test", category: "test", name: "s1 def two", type: .event, tags: ["ios", "iosonly"]), ] let sectionTwo = AnalyticsCategory(id: "section_two") sectionTwo.definitions = [ - getAnalyticsDefinition(id: "s2_def_one", path: "s2_def_one/", name: "s2 def one", type: AnalyticsDefinition.TagType.screen, tags: ["ios","iosonly"]), - getAnalyticsDefinition(id: "s2_def_two", path: "s2_def_two/", name: "s2 def two", type: AnalyticsDefinition.TagType.event, tags: ["droid","droidonly"]), + getAnalyticsDefinition(id: "s2_def_one", path: "s2_def_one/", name: "s2 def one", type: .screen, tags: ["ios","iosonly"]), + getAnalyticsDefinition(id: "s2_def_two", action: "test", category: "test", name: "s2 def two", type: .event, tags: ["droid","droidonly"]), ] let sectionThree = AnalyticsCategory(id: "section_three") sectionThree.definitions = [ - getAnalyticsDefinition(id: "s3_def_one", path: "s3_def_one/", name: "s3 def one", type: AnalyticsDefinition.TagType.screen, tags: ["droid","droidonly"]), - getAnalyticsDefinition(id: "s3_def_two", path: "s3_def_two/", name: "s3 def two", type: AnalyticsDefinition.TagType.event, tags: ["droid","droidonly"]), + getAnalyticsDefinition(id: "s3_def_one", path: "s3_def_one/", name: "s3 def one", type: .screen, tags: ["droid","droidonly"]), + getAnalyticsDefinition(id: "s3_def_two", action: "test", category: "test", name: "s3 def two", type: .event, tags: ["droid","droidonly"]), ] // When @@ -163,14 +225,18 @@ final class AnalyticsGeneratorTests: XCTestCase { let expect = """ // Generated by ResgenSwift.Analytics 1.2 - import UIKit import MatomoTracker // MARK: - Protocol protocol AnalyticsManagerProtocol { func logScreen(name: String, path: String) - func logEvent(name: String) + func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) } // MARK: - Matomo @@ -186,7 +252,10 @@ final class AnalyticsGeneratorTests: XCTestCase { init(siteId: String, url: String) { debugPrint("[Matomo service] Server URL: \\(url)") debugPrint("[Matomo service] Site ID: \\(siteId)") - tracker = MatomoTracker(siteId: siteId, baseURL: URL(string: url)!) + tracker = MatomoTracker( + siteId: siteId, + baseURL: URL(string: url)! + ) #if DEBUG tracker.dispatchInterval = 5 @@ -205,6 +274,7 @@ final class AnalyticsGeneratorTests: XCTestCase { func logScreen(name: String, path: String) { guard !tracker.isOptedOut else { return } guard let trackerUrl = tracker.contentBase?.absoluteString else { return } + let urlString = URL(string: "\\(trackerUrl)" + "/" + "\\(path)" + "iOS") tracker.track( view: [name], @@ -212,11 +282,17 @@ final class AnalyticsGeneratorTests: XCTestCase { ) } - func logEvent(name: String) { + func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) { guard !tracker.isOptedOut else { return } + tracker.track( - eventWithCategory: "category", - action: "action", + eventWithCategory: category, + action: action, name: name, number: nil, url: nil @@ -237,40 +313,70 @@ final class AnalyticsGeneratorTests: XCTestCase { // MARK: - Methods - func setAnalyticsEnabled(_ enable: Bool) { isEnabled = enable } + func setAnalyticsEnabled(_ enable: Bool) { + isEnabled = enable + } func configure(siteId: String, url: String) { - managers.append(MatomoAnalyticsManager(siteId: siteId, url: url)) + managers.append( + MatomoAnalyticsManager( + siteId: siteId, + url: url + ) + ) } private func logScreen(name: String, path: String) { guard isEnabled else { return } + managers.forEach { manager in manager.logScreen(name: name, path: path) } } - private func logEvent(name: String) { + private func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) { guard isEnabled else { return } + managers.forEach { manager in - manager.logEvent(name: name) + manager.logEvent( + name: name, + action: action, + category: category, + params: params + ) } } // MARK: - section_one func logScreenS1DefOne() { - logScreen(name: "s1 def one", path: "s1_def_one/") + logScreen( + name: "s1 def one", + path: "s1_def_one/" + ) } func logEventS1DefTwo() { - logEvent(name: "s1 def two") + logEvent( + name: "s1 def two", + action: "test", + category: "test", + params: [] + ) } - + // MARK: - section_two func logScreenS2DefOne() { - logScreen(name: "s2 def one", path: "s2_def_one/") + logScreen( + name: "s2 def one", + path: "s2_def_one/" + ) } } @@ -286,20 +392,20 @@ final class AnalyticsGeneratorTests: XCTestCase { // Given let sectionOne = AnalyticsCategory(id: "section_one") sectionOne.definitions = [ - getAnalyticsDefinition(id: "s1_def_one", path: "s1_def_one/", name: "s1 def one", type: AnalyticsDefinition.TagType.screen, tags: ["ios", "iosonly"]), - getAnalyticsDefinition(id: "s1_def_two", path: "s1_def_two/", name: "s1 def two", type: AnalyticsDefinition.TagType.event, tags: ["ios", "iosonly"]), + getAnalyticsDefinition(id: "s1_def_one", path: "s1_def_one/", name: "s1 def one", type: .screen, tags: ["ios", "iosonly"]), + getAnalyticsDefinition(id: "s1_def_two", action: "test", category: "test", name: "s1 def two", type: .event, tags: ["ios", "iosonly"]), ] let sectionTwo = AnalyticsCategory(id: "section_two") sectionTwo.definitions = [ - getAnalyticsDefinition(id: "s2_def_one", path: "s2_def_one/", name: "s2 def one", type: AnalyticsDefinition.TagType.screen, tags: ["ios","iosonly"]), - getAnalyticsDefinition(id: "s2_def_two", path: "s2_def_two/", name: "s2 def two", type: AnalyticsDefinition.TagType.event, tags: ["droid","droidonly"]), + getAnalyticsDefinition(id: "s2_def_one", path: "s2_def_one/", name: "s2 def one", type: .screen, tags: ["ios","iosonly"]), + getAnalyticsDefinition(id: "s2_def_two", action: "test", category: "test", name: "s2 def two", type: .event, tags: ["droid","droidonly"]), ] let sectionThree = AnalyticsCategory(id: "section_three") sectionThree.definitions = [ - getAnalyticsDefinition(id: "s3_def_one", path: "s3_def_one/", name: "s3 def one", type: AnalyticsDefinition.TagType.screen, tags: ["droid","droidonly"]), - getAnalyticsDefinition(id: "s3_def_two", path: "s3_def_two/", name: "s3 def two", type: AnalyticsDefinition.TagType.event, tags: ["droid","droidonly"]), + getAnalyticsDefinition(id: "s3_def_one", path: "s3_def_one/", name: "s3 def one", type: .screen, tags: ["droid","droidonly"]), + getAnalyticsDefinition(id: "s3_def_two", action: "test", category: "test", name: "s3 def two", type: .event, tags: ["droid","droidonly"]), ] // When @@ -312,7 +418,6 @@ final class AnalyticsGeneratorTests: XCTestCase { let expect = """ // Generated by ResgenSwift.Analytics 1.2 - import UIKit import MatomoTracker import Firebase @@ -320,7 +425,12 @@ final class AnalyticsGeneratorTests: XCTestCase { protocol AnalyticsManagerProtocol { func logScreen(name: String, path: String) - func logEvent(name: String) + func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) } // MARK: - Matomo @@ -336,7 +446,10 @@ final class AnalyticsGeneratorTests: XCTestCase { init(siteId: String, url: String) { debugPrint("[Matomo service] Server URL: \\(url)") debugPrint("[Matomo service] Site ID: \\(siteId)") - tracker = MatomoTracker(siteId: siteId, baseURL: URL(string: url)!) + tracker = MatomoTracker( + siteId: siteId, + baseURL: URL(string: url)! + ) #if DEBUG tracker.dispatchInterval = 5 @@ -355,6 +468,7 @@ final class AnalyticsGeneratorTests: XCTestCase { func logScreen(name: String, path: String) { guard !tracker.isOptedOut else { return } guard let trackerUrl = tracker.contentBase?.absoluteString else { return } + let urlString = URL(string: "\\(trackerUrl)" + "/" + "\\(path)" + "iOS") tracker.track( view: [name], @@ -362,11 +476,17 @@ final class AnalyticsGeneratorTests: XCTestCase { ) } - func logEvent(name: String) { + func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) { guard !tracker.isOptedOut else { return } + tracker.track( - eventWithCategory: "category", - action: "action", + eventWithCategory: category, + action: action, name: name, number: nil, url: nil @@ -378,15 +498,37 @@ final class AnalyticsGeneratorTests: XCTestCase { class FirebaseAnalyticsManager: AnalyticsManagerProtocol { func logScreen(name: String, path: String) { - Analytics.logEvent(AnalyticsEventScreenView, parameters: [AnalyticsParameterScreenName: name]) + var parameters = [ + AnalyticsParameterScreenName: name + ] + + Analytics.logEvent( + AnalyticsEventScreenView, + parameters: parameters + ) } - func logEvent(name: String) { - var parameters = [ - AnalyticsParameterValue: name + func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) { + var parameters: [String:Any] = [ + "action": action, + "category": category, ] + + if let supplementaryParameters = params { + parameters.merge(supplementaryParameters) { (origin, new) -> Any in + return origin + } + } - Analytics.logEvent(AnalyticsEventSelectContent, parameters: parameters) + Analytics.logEvent( + name, + parameters: parameters + ) } } @@ -403,41 +545,71 @@ final class AnalyticsGeneratorTests: XCTestCase { // MARK: - Methods - func setAnalyticsEnabled(_ enable: Bool) { isEnabled = enable } + func setAnalyticsEnabled(_ enable: Bool) { + isEnabled = enable + } func configure(siteId: String, url: String) { - managers.append(MatomoAnalyticsManager(siteId: siteId, url: url)) + managers.append( + MatomoAnalyticsManager( + siteId: siteId, + url: url + ) + ) managers.append(FirebaseAnalyticsManager()) } private func logScreen(name: String, path: String) { guard isEnabled else { return } + managers.forEach { manager in manager.logScreen(name: name, path: path) } } - private func logEvent(name: String) { + private func logEvent( + name: String, + action: String, + category: String, + params: [String: Any]? + ) { guard isEnabled else { return } + managers.forEach { manager in - manager.logEvent(name: name) + manager.logEvent( + name: name, + action: action, + category: category, + params: params + ) } } // MARK: - section_one func logScreenS1DefOne() { - logScreen(name: "s1 def one", path: "s1_def_one/") + logScreen( + name: "s1 def one", + path: "s1_def_one/" + ) } func logEventS1DefTwo() { - logEvent(name: "s1 def two") + logEvent( + name: "s1 def two", + action: "test", + category: "test", + params: [] + ) } - + // MARK: - section_two func logScreenS2DefOne() { - logScreen(name: "s2 def one", path: "s2_def_one/") + logScreen( + name: "s2 def one", + path: "s2_def_one/" + ) } }