Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゴリ押しでどうにかするHasuraのPermission Testing

ゴリ押しでどうにかするHasuraのPermission Testing

HasuraではPermissionを細かく・わかりやすく設定可能です。しかしテストを実施しないかぎりは設定したPermissionが想定通りであることを保証できません。今回は実際に開発・運用しているマルチテナントアプリケーションを例に、Permissionのテストにおける辛みと共通化の可能性について紹介します。

Tohru Kobayashi

October 20, 2023
Tweet

Other Decks in Programming

Transcript

  1. 所属企業 - DHH, LLC https://dhh.co.jp/ - Ruby on Railsの作者・DHH(David Heinemeier

    Hansson) のビジネス感覚が好き な2人が作った会社 - http://www.turnyourideasintoreality.com/2014/02/dhh/ - 自社サービスと受託開発の両輪
  2. アプリケーション - Hooolders Analytics https://lp.hooolders.com/ - 株式会社 Figurout https://figurout.co.jp/ が開発/サービス提供

    - DHH, LLC.はシステム設計・開発を担当 - 企業と投資家とのエンゲージメントプラットフォーム / IRアナリティクスツール - 自社分析機能 - 企業比較機能 - ニュース検索機能 - カスタムアラート機能
  3. アプリケーション Firebase Hosting Firebase Auth Hasura Cloud Run Hasura Actions

    Backend Cloud Functions PostgreSQL Cloud SQL Cloud Storage Transfer/Parser Cloud Functions Hasura Actions Backend Cloud Functions PostgreSQL Cloud SQL Hasura Cloud Run Firebase Auth Firebase Hosting Scheduled Notification Cloud Functions
  4. パーミッション - Hasura上のRole - staff: サービスの運営 - user: 契約ユーザー -

    system: バックエンドからのアクセス用 - 論理的なRole - GroupでのRoleにuserを分割 - staff: サービスの運営 - owner: 所属グループのリソースへのアクセス、所属グループへの招待、 ownerへの昇格 - member: 所属グループのリソースへのアクセス - invitee: あるグループから招待を受けている - system: バックエンドからのアクセス
  5. テストのやり方 - テーブルに対して各ロールがCRUD表の動作を満たすか確認 - テーブル - permissionを構成するテーブル 7個 (users, staffs,

    staffInvitations, memberships, ownerships, groupInvitaitons, groups) - 機能を構成するテーブル N個 (groupWatchLists, groupWatchListStocks, stockIssues, stockPrices, ….) - ロール 6種 (staff, owner, member, invitee, anonymous, system) - CRUD 条件によって様々ある
  6. テストのやり方 - 道具 - TypeScript + URQL+ Jest - 構成

    - /test - /utils/clients/ 各パーミッションのクライアントを生成するファンクション - /permissions/ - /groups, /memberships, /ownerships,… 各テーブル毎 - /queries GraphQLのQuery/Mutation - /insert.ts, /select.ts, /update.ts, /delete.ts, /fragment.ts - /insert, /select, /update, /delete CRUD毎 - /staff.test.ts, member.test.ts,... Permission毎のテストコード
  7. つらみ - 数が多くてつらい - テーブル数 58 (2023/10/20時点) - Role 6

    - CRUD 4 - 可不可を両方テストする必要があるので 2 - 58 x 6 x 4 x 2 = 2592ケース
  8. つらみ - 数が多くてつらい - テーブル数 58 (2023/10/20時点) - Role 6

    - CRUD 4 - 可不可を両方テストする必要があるので 2 - 58 x 6 x 4 x 2 = 2592ケース ゴリ押し!!!
  9. 共通化 - テストの共通化 - 基本的には共通化するべきでない - コピペ + sedでどうにかできる -

    cp -r hasura/test/permissions/templateTable hasura/test/permissions/targetTable - sed -e ‘s/templateTable/targetTable/g’ hasura/test/permissions/targetTable/**/*.ts -i
  10. 共通化 - テストの共通化 -> 省力化 - 基本的には共通化するべきでない - コピペ +

    sedでどうにかできる - cp -r hasura/test/permissions/templateTable hasura/test/permissions/targetTable - sed -e ‘s/templateTable/targetTable/g’ hasura/test/permissions/targetTable/**/*.ts -i
  11. まとめ - Hasuraにおけるマルチテナントの実現方法例を示した - もちろん違う方法もある - JWTにgroupIdをもたせる方法でもできるよ - HasuraにおけるPermissionテストのやり方を示した -

    ロジックは単純 - まともにやったら数はすごい ゴリ押しでどうにかしてはならない - 共通化・省力化は設計しだいで可能だよ