From 4cb058f1cacb9ad92747bb4b62bff757e82869a0 Mon Sep 17 00:00:00 2001 From: shivekkhurana Date: Fri, 20 Nov 2020 16:17:45 +0530 Subject: [PATCH] Add notes on testing, translations, merging and starting Refrisk Signed-off-by: shivekkhurana --- doc/codebase-structure-and-guidelines.md | 73 +++++++++++++++++++++-- doc/log-settings.png | Bin 0 -> 34119 bytes 2 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 doc/log-settings.png diff --git a/doc/codebase-structure-and-guidelines.md b/doc/codebase-structure-and-guidelines.md index 1dcad99085..77bd60bdb6 100644 --- a/doc/codebase-structure-and-guidelines.md +++ b/doc/codebase-structure-and-guidelines.md @@ -1,4 +1,11 @@ -# Business Logic Modules +# Codebase Strucuture and Guidelines + + +## Starting the app + +The app is bundled and run in a Nix environment. Information regarding how to run it locally can be found [here](https://status.im/technical/build_status/). + +## Business Logic Modules Each business logic module is managed in a module directory. @@ -31,7 +38,7 @@ Rationale and how to get there: Currently a lot of business logic is lost in utils and screens namespaces and should be moved to dedicated top level directories. This should make core logic of the app more accessible and organized -## core.cljs +### core.cljs Core namespace must only contain functions that can be called outside of the module (i.e. in events or other modules): @@ -45,7 +52,7 @@ Core namespace must only contain functions that can be called outside of the mod {:db (module.db/set-current-account db)}) ``` -## db.cljs +### db.cljs - must contain specs for the app-db subpart the module modifies - must contain getter and setter functions used by fx producing functions and subscriptions @@ -55,13 +62,15 @@ Rationale: These guidelines make db.cljs namespaces the place to go when making changes to the db layout and minimize breaking changes when adding/refactoring features -# Subscriptions +## re-frame + +### Subscriptions - all subscriptions must be defined in the single `status-im.subs` namespace - subscriptions must subscribe only on other subscriptions, and never on app-db itself - `reg-root-key-sub` should be used for the root keys subscriptions -# Events +### Events - all events must be defined in the single `status-im.events` namespace which can be considered as an index of everything going on in the app - events must always be declared with `register-handler-fx`, no `register-handler-db` @@ -78,3 +87,57 @@ These guidelines make db.cljs namespaces the place to go when making changes to - `:module.ui/` for user triggered events - `:module.callback/` for callback events, which are events bringing back the result of an fx to the event loop, the name of the event should end with `-success` or `-error` most of the time. Other possibilities can be `-granted`, `-denied` for instance. - `:module/` for internal events, examples are time based events marked `-timed-out`, external changes marked `-changed` or reception of external events marked `-received`. + +## Testing flow +- All PRs automatically go to "REVIEW" column on [Pipeline for QA](https://github.com/status-im/status-react/projects/7) project on Github. This is our main board for QA / devs interaction +- After the PR gets at least 1 approval, it should be moved to "E2E Tests" column. Some PRs may need approvals from more than one person. +- Critical path tests are automatically run for all PRs in "E2E Tests" column. +- If E2E tests pass: + - If PR doesn't need manual QA (it is small change or change doesn't relate to app) - after passing e2e tests it can be merged (don't use the Github UI to merge, check section on merging PRs). + + - If manual QA needed - add label 'request manual qa'. The QA team will process it (make sure the summary and test instructions are clear). QA team will review results and test PR on different platforms and assign one of the three labels: + - No issues - label 'TESTED-OK' and then you can merge it. + - If issues - label 'TESTED-ISSUES' and comment from QA with bugs. + - After fix and/or discussion the process is repeated. + + - If manual QA is not needed but all tests don't pass, you can ping @churik or @Serhy to confirm that failed E2E tests are not unrelated. + +## Enabling debug logs +Calls to `log/debug` will not be printed to the console by default. It can be enabled under "Advanced settings" in the app: + +![Enable Debug Logs](./log-settings.png) + +## Translations +The app relies on system locale to select a language from the [list of supported languages](https://github.com/status-im/status-react/blob/bda73867471cf2bb8a68b1cc27c9f94b92d9a58b/src/status_im/i18n_resources.cljs#L9). It falls back to English in cash the system locale is not supported. + +We use Lokalise App to manage [translations](https://translate.status.im/). In case you need to add/remove a key to translations, you only need to change `en.json`. Missing keys fallback to `en.json`. The actual translations will be added by Lokalise. + +## re-frisk +re-frisk is a state visualization tool written by our very own Andrey (@flexsurfer). To start re-frisk, execute the following command: +```bash +$ yarn shadow-cljs run re-frisk-remote.core/start +``` + +or you can also use make: + +```bash +$ make run-re-frisk +``` + +A server will be started at http://localhost:4567. It might show "not connected" at first. Don't worry and just start using the app. The events and state will populate. + +## Merging approved PRs +We don't Github's UI to merge. Instead `./scripts/merge-pr.sh` is used to sign and merge PR to `develop`. You first need to enable [GPG signing on you commits](https://github.com/status-im/status-react/blob/develop/STARTING_GUIDE.md#configure-gpg-keys-for-signing-commits). + +Once your commits are verfied and PR approved, you can run the script like so: + +```bash +$ git checkout develop +$ git fetch +$ git reset --hard origin/develop +$ ./scripts/merge-pr.sh 11370 +``` +Replace 11370 with your PR id. + +## Release process +TODO(shivekkhurana): Compile release notes diff --git a/doc/log-settings.png b/doc/log-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..8821d8c218cb4f02d10835628d176ce2e77e69f6 GIT binary patch literal 34119 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