{"id":51029968,"url":"https://github.com/dappros/ethora-demo-qa","last_synced_at":"2026-06-21T23:30:49.751Z","repository":{"id":361837755,"uuid":"1256027275","full_name":"dappros/ethora-demo-qa","owner":"dappros","description":"Self-driving demo + QA harness for the Ethora chat SDKs: provisions a themed test world, then drives the React.js and React Native chat components side by side and captures screenshots/video.","archived":false,"fork":false,"pushed_at":"2026-06-01T14:16:02.000Z","size":119,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T14:18:41.249Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dappros.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-01T11:49:49.000Z","updated_at":"2026-06-01T13:45:34.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dappros/ethora-demo-qa","commit_stats":null,"previous_names":["dappros/ethora-demo-qa"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/dappros/ethora-demo-qa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappros%2Fethora-demo-qa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappros%2Fethora-demo-qa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappros%2Fethora-demo-qa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappros%2Fethora-demo-qa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dappros","download_url":"https://codeload.github.com/dappros/ethora-demo-qa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dappros%2Fethora-demo-qa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34629658,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-21T23:30:48.291Z","updated_at":"2026-06-21T23:30:49.734Z","avatar_url":"https://github.com/dappros.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ethora-demo-qa\n\n**A self-driving demo + QA harness for the [Ethora](https://github.com/dappros/ethora) chat SDKs.**\n\nIt provisions a themed test world on an Ethora server, then drives the\n**React.js** ([`ethora-chat-component`](https://github.com/dappros/ethora-chat-component))\nand **React Native** ([`ethora-chat-component-rn`](https://github.com/dappros/ethora-chat-component-rn))\nchat components through scripted scenarios — side by side, one user on the web\nand one on a mobile simulator — capturing screenshots (and, later, video) for\nboth **marketing** and **QA**.\n\nThe goal: never again hand-assemble a chat demo with throwaway names and a flat\nconversation. Run one command, get a polished, repeatable, cross-platform\nshowcase that also doubles as an end-to-end regression check.\n\n\u003e **No credentials are ever committed.** The harness provisions a throwaway\n\u003e tenant account, app, and test users via the Ethora API and stores them only\n\u003e in `secrets/` (gitignored). See [Security](#security).\n\n## What it does\n\n**Once per scenario (provisioning):**\n1. Creates a throwaway owner account + a fresh app on the target server.\n2. Creates themed test users with real display names and generated avatars\n   (the reference scenario casts *A Midsummer Night's Dream*).\n\n**Every run:**\n1. Tears down the previous chat room and creates a fresh group chat (over XMPP).\n2. Subscribes the whole cast and seeds backstory history.\n3. Drives the **web** component (Playwright) and the **iOS** RN component\n   (Maestro + `simctl`) through one scripted scenario: sending messages and\n   media, typing indicators, read receipts, editing and deleting messages, and\n   loading older history.\n4. Captures screenshots from both surfaces into `artifacts/`.\n\n## Quick start\n\n```bash\nnpm install\ncp .env.example .env          # defaults target the QA cluster\nnpm run doctor                # check tooling (node, playwright, simulator, maestro)\nnpm run provision             # create account + app + cast on the server (once)\nnpm run run                   # reset the room and run the scenario on web + iOS\n```\n\n| Command | What it does |\n|---------|--------------|\n| `npm run doctor` | Verify local tooling and the target server. |\n| `npm run provision` | Create the owner/app/cast (idempotent; `-- --fresh` to recreate). |\n| `npm run reset` | Destroy + recreate the room, re-seed history. |\n| `npm run run` | Full scenario across web + iOS (`run:web` / `run:ios` for one surface). |\n\nScenario selection: append `-- --scenario midsummer` (default) to any command.\n\n## Architecture\n\n```\nsrc/\n  config.ts            Env + server presets (QA / prod)\n  cli.ts               Command entry (provision / reset / run / doctor)\n  provision/\n    ethora-api.ts      REST client (account, app, user, avatar)\n    avatar.ts          Dependency-free themed SVG avatars\n    provision.ts       Account + app + cast (REST)\n    room-setup.ts      Room create + subscribe + seed (XMPP)\n    state.ts           Gitignored world.\u003cenv\u003e.\u003cscenario\u003e.json\n  xmpp/client.ts       Node XMPP client (mirrors the SDK stanzas; SASL PLAIN)\n  scenarios/           Scenario schema + themed casts/scripts (pure data)\n  web/                 Playwright runner (React.js component)\n  mobile/              Maestro + simctl runner (React Native component, iOS)\n```\n\nNew scenarios are **pure data** — add a cast and a script in `src/scenarios/`,\nno engine changes. See `src/scenarios/midsummer.ts` for the reference.\n\n## Security\n\n- `secrets/` and `.env` are gitignored and never committed.\n- The harness provisions a **throwaway** account on the QA server; the\n  resulting credentials live only in `secrets/world.\u003cenv\u003e.\u003cscenario\u003e.json`.\n- Test emails use `@mailinator.com` so they never reach a real inbox.\n- This repo is public; treat the QA server as the only place demo state lives.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdappros%2Fethora-demo-qa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdappros%2Fethora-demo-qa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdappros%2Fethora-demo-qa/lists"}