Skip to content

#148 Cabals tab: QA evidence

Simulator: iPhone SE (3rd generation), iOS 18.0, slimmed with SimSlim. Debug build.

How to reproduce

The Debug-only launch argument -MonacoCabalsTabSample opens the Cabals tab on built-in sample data. It skips sign-in and needs no backend (apps/mobile/Monaco/Features/Debug/CabalsTabSampleData.swift). Release builds don't compile it.

xcodebuild -project apps/mobile/Monaco.xcodeproj -scheme Monaco -configuration Debug \
  -destination 'platform=iOS Simulator,id=<sim udid>' \
  CODE_SIGN_IDENTITY="-" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=YES \
  test -only-testing:MonacoTests -only-testing:MonacoUITests/CabalsTabSampleUITests

Screenshots 01 to 05 are XCTAttachments exported from that run. Screenshot 06 was taken with xcrun simctl io ... screenshot after xcrun simctl ui ... appearance dark.

Screenshots

File Shows
01-overview.png Search field, P&L chart with one line per joined cabal (tone and dash pattern tell the lines apart; green and red appear only on P&L figures), 1D/1W/1M/3M range chips, legend with the latest P&L, and the start of the "Your cabals" strip
02-leaderboard.png Platform board: rank, name, member count with join status (Open, Approval, Joined), pot value, dollar P&L, and percent return
03-search-results.png Search for "week" after the 300ms debounce: a joined cabal and an open cabal
04-search-empty.png Empty state for a query with no match
05-join-approval.png Tapping an approval-only cabal opens the ask-to-join screen with the cabal's name
06-overview-dark.png Overview in dark mode

Results

  • CabalsTabSampleUITests: 7 of 7 passed. Covered: overview (chart, 3 legend rows, strip, board), board rows after scrolling, search results, empty search, too-short query hint, ask-to-join routing, and a strip card pushing the cabal screen.
  • MonacoTests (CabalsTabModelTests): 7 of 7 passed. Covered: debounce sends only the last query, a single character never hits the server, clearing cancels a pending search, empty and error states, 401 signs out, and a range change reloads the chart.

Not covered here

  • Live backend data. The server contract is covered by Go handler tests in apps/backend/internal/httpapi/groups_tab_test.go.
  • The join submit button. The harness has no backend, so the tests stop at the join screen.
  • The navigation bar is transparent app-wide. Content that scrolls under the title shows through it (visible at the top of 02-leaderboard.png). This was already the case before this change.