diff --git a/custom-words.txt b/custom-words.txt index aaf6cc11e..6d2a76a87 100644 --- a/custom-words.txt +++ b/custom-words.txt @@ -74,6 +74,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 9c5be6e3c..1c045ed9d 100644 --- a/docs/architecture/mobile-clients/ios/index.md +++ b/docs/architecture/mobile-clients/ios/index.md @@ -453,6 +453,54 @@ This makes it convenient to switch between these files or open them side-by-side [ios version](https://github.com/bitwarden/ios/blob/main/.test-simulator-ios-version)), otherwise tests may fail because of subtle differences between iOS versions. +### Mock 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, especially in function parameters. In such cases prefer to +create the mock manually and remove the protocol's `AutoMockable` comment. + +::: + +#### Custom annotations + +Sourcery allows us to annotate different parts of our code to guide code generation. 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 especially useful when using + function overloading where we need the mocked names to also have the parameter 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 +} +``` + ### Test plans Test plans are organized in the `TestPlans` folder of the iOS repository. Each project has multiple diff --git a/docs/getting-started/mobile/ios/index.md b/docs/getting-started/mobile/ios/index.md index af1e1dcb6..868644165 100644 --- a/docs/getting-started/mobile/ios/index.md +++ b/docs/getting-started/mobile/ios/index.md @@ -8,9 +8,9 @@ sidebar_position: 1 1. [Xcode](https://developer.apple.com/xcode/) (using [this](https://github.com/bitwarden/ios/blob/main/.xcode-version) version) -2. iOS & watchOS simulator runtimes installed +2. iOS and watchOS simulator runtimes installed 3. An iPhone simulator set up (check - [model](https://github.com/bitwarden/ios/blob/main/.test-simulator-device-name) & + [model](https://github.com/bitwarden/ios/blob/main/.test-simulator-device-name) and [version](https://github.com/bitwarden/ios/blob/main/.test-simulator-ios-version) to make/run snapshots) @@ -61,8 +61,8 @@ sidebar_position: 1 $ cp Scripts/post-checkout .git/hooks/ ``` - Also, if the Xcode version installed mismatches the expected one you will receive a warning when - the script finishes like this one which can help troubleshooting. + Also, if the installed Xcode version does not match the expected version, you will receive a + warning, which can help with troubleshooting. That warning looks like this: ``` 🟡 Xcode version mismatch!