From 43eb39e237d89c9dd62875cef23a3d982e0be1e4 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Mon, 7 Jul 2025 14:54:40 -0300 Subject: [PATCH 1/2] PM-25300 Add Sourcery usage on iOS architecture. --- custom-words.txt | 1 + docs/architecture/mobile-clients/ios/index.md | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/custom-words.txt b/custom-words.txt index 01336186f..d79939f37 100644 --- a/custom-words.txt +++ b/custom-words.txt @@ -71,6 +71,7 @@ SDLC Serilog signtool signup +Sourcery sqlcmd struct structs diff --git a/docs/architecture/mobile-clients/ios/index.md b/docs/architecture/mobile-clients/ios/index.md index 46c3b31cd..a7c2071be 100644 --- a/docs/architecture/mobile-clients/ios/index.md +++ b/docs/architecture/mobile-clients/ios/index.md @@ -444,3 +444,27 @@ This makes it convenient to switch between these files or open them side-by-side mode, dark mode, and with a large dynamic type size. ⚠️ These tests are done using an **iPhone 15 Pro (17.0.1)** simulator, otherwise tests may fail because of subtle differences between iOS versions. + +### Mocks generation + +We use [Sourcery](https://github.com/krzysztofzablocki/Sourcery) for automatic mock generation. + +In order to automatically generate a mock from a protocol, just add a comment with +`// sourcery: AutoMockable` to such protocol, perform a build and the mock will be automatically +generated and added to the `AutoMockable.generated.swift` file. + +For example: + +```swift +protocol FooProtocol { // sourcery: AutoMockable + func bar() -> Bool +} +``` + +:::info Manual generation + +There are some cases where the automatically generated mock does not cover the mock scenario we want +or it cannot handle some closure types, specially in function's parameters. In such cases prefer +create the mock manually and remove the protocol's comment as `AutoMockable`. + +::: From a29213592cca9a0f991f560412f7e9b8b41a6b5e Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Fri, 25 Jul 2025 16:56:01 -0300 Subject: [PATCH 2/2] PM-23500 Added section for Sourcery custom annotations. --- docs/architecture/mobile-clients/ios/index.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/architecture/mobile-clients/ios/index.md b/docs/architecture/mobile-clients/ios/index.md index a7c2071be..6feca23ea 100644 --- a/docs/architecture/mobile-clients/ios/index.md +++ b/docs/architecture/mobile-clients/ios/index.md @@ -468,3 +468,27 @@ or it cannot handle some closure types, specially in function's parameters. In s create the mock manually and remove the protocol's comment as `AutoMockable`. ::: + +#### Custom annotations + +Sourcery allows us to annotate different parts of our code to guide code generation. On top of this +custom annotations have been added in `AutoMockable.stencil` to handle special cases. + +- **useSelectorName**: Method annotation used to indicate that the generated mocked properties need + to use the selector name instead of the short method name. This is specially useful when using + function overloading where we need the mocked names to also have the parameters names to + differentiate between the different mocked functions. +- **mockReceivedInvocations**: Method annotation used to indicate that we want to generate the + mocked property to store an array of the received invocations of the parameters passed each time + the function is called. + +For example: + +```swift +protocol FooProtocol { // sourcery: AutoMockable + func bar(fooParameter: String) -> Bool + func bar(anotherParameter: Int) -> Bool // sourcery: useSelectorName + func saveNumber(theNumber: Int) -> Bool // sourcery: mockReceivedInvocations + func annotateMultiple(fooParameter: String) // sourcery: useSelectorName, mockReceivedInvocations +} +```