0
0
mirror of https://github.com/PostHog/posthog.git synced 2024-11-21 21:49:51 +01:00

React component tests with cypress (#3233)

* WIP: get cypress something doing

* Get a test running

* Get css loading, stub posthog

* Move helpers to separate file

* Givens > given2

It plays nicer with beforeEach

* Test for session filters

* Test date navigation

* Test filtering

* Try keep old tests running

* Try get tests running under CI

* Prettify fixtures

* Cleanup, use cypress 6

* Add yarn build

* Fix e2e cypress tests

* given2 => givens

* Rename `frontend-test-runner` to `e2e-test-runner`

* Fix cypress test

* Add webpack-preprocessor as a devDependency

* Improve freezing time

* Make css inclusions automatic for component tests
This commit is contained in:
Karl-Aksel Puulmann 2021-02-09 17:28:01 +02:00 committed by GitHub
parent a19978a249
commit 30b6692920
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 3640 additions and 136 deletions

60
.github/workflows/cypress-component.yml vendored Normal file
View File

@ -0,0 +1,60 @@
name: Cypress Component
on:
- pull_request
jobs:
cypress-component:
name: Cypress component tests
runs-on: ubuntu-18.04
steps:
- name: Checkout
uses: actions/checkout@v1
- uses: actions/setup-node@v1
with:
node-version: 14
- name: Get yarn cache directory path
id: yarn-dep-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- uses: actions/cache@v1
name: Setup Yarn dep cache
id: yarn-dep-cache
with:
path: ${{ steps.yarn-dep-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-dep-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-dep-
- name: Yarn install deps
run: |
yarn install --frozen-lockfile; yarn add cypress@6.4.0
- uses: actions/cache@v1
name: Setup Yarn build cache
id: yarn-build-cache
with:
path: frontend/dist
key: ${{ runner.os }}-yarn-build-${{ hashFiles('frontend/src/') }}
restore-keys: |
${{ runner.os }}-yarn-build-
- name: Yarn build
run: |
yarn build
if: steps.yarn-build-cache.outputs.cache-hit != 'true'
- name: Cypress run
uses: cypress-io/github-action@v2
with:
config-file: cypress.json
record: true
parallel: true
group: 'PostHog Component'
env:
# pass the Dashboard record key as an environment variable
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
# Recommended: pass the GitHub token lets this action correctly
# determine the unique run id necessary to re-run the checks
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Archive test screenshots
uses: actions/upload-artifact@v1
with:
name: screenshots
path: cypress/screenshots
if: ${{ failure() }}

View File

@ -5,7 +5,7 @@ on:
jobs:
cypress:
name: Cypress tests
name: Cypress E2E tests
runs-on: ubuntu-18.04
strategy:
# when one test fails, DO NOT cancel the other
@ -76,7 +76,7 @@ jobs:
- name: Yarn install deps
run: |
yarn install --frozen-lockfile
yarn add cypress@5.3.0 cypress-terminal-report@2.1.0
yarn add cypress@6.4.0 cypress-terminal-report@2.1.0
- uses: actions/cache@v1
name: Setup Yarn build cache
id: yarn-build-cache
@ -108,7 +108,7 @@ jobs:
- name: Cypress run
uses: cypress-io/github-action@v2
with:
config-file: cypress.json
config-file: cypress.e2e.json
record: true
parallel: true
group: 'PostHog Frontend'

View File

@ -7,6 +7,6 @@ DEBUG=1 DATABASE_URL=postgres://localhost:5432/posthog_e2e_test python manage.py
DEBUG=1 DATABASE_URL=postgres://localhost:5432/posthog_e2e_test python manage.py setup_dev &
yarn add cypress-terminal-report
./bin/start-frontend &
CYPRESS_BASE_URL=http://localhost:8080 npx cypress open &
CYPRESS_BASE_URL=http://localhost:8080 npx cypress open --config-file cypress.e2e.json &
DEBUG=1 TEST=1 DATABASE_URL=postgres://localhost:5432/posthog_e2e_test python manage.py runserver 8080
yarn remove cypress-terminal-report
yarn remove cypress-terminal-report

9
cypress.e2e.json Normal file
View File

@ -0,0 +1,9 @@
{
"video": false,
"baseUrl": "http://localhost:8000",
"defaultCommandTimeout": 20000,
"requestTimeout": 8000,
"pageLoadTimeout": 80000,
"projectId": "twojfp",
"retries": 2
}

View File

@ -1,9 +1,7 @@
{
"video": false,
"baseUrl": "http://localhost:8000",
"defaultCommandTimeout": 20000,
"requestTimeout": 8000,
"pageLoadTimeout": 80000,
"projectId": "twojfp",
"retries": 2
"experimentalComponentTesting": true,
"testFiles": "**/*cy-spec.js",
"componentFolder": "frontend/src",
"projectId": "twojfp"
}

View File

@ -0,0 +1,51 @@
{
"count": 4,
"next": null,
"previous": null,
"results": [
{
"id": 7,
"name": "App Analytics",
"pinned": true,
"items": null,
"created_at": "2021-02-05T13:55:40.297406Z",
"created_by": null,
"is_shared": false,
"share_token": "w_MkBdFSPoOZdB1yIOvmOJn_iQtxCA",
"deleted": false
},
{
"id": 5,
"name": "Default",
"pinned": true,
"items": null,
"created_at": "2021-02-05T13:55:31.501043Z",
"created_by": null,
"is_shared": false,
"share_token": "fpDJjZ0iRgptWJYg-_l5buldK--7t6C6P9pTEXBQcZo",
"deleted": false
},
{
"id": 8,
"name": "Sales & Revenue",
"pinned": true,
"items": null,
"created_at": "2021-02-05T13:55:43.654638Z",
"created_by": null,
"is_shared": false,
"share_token": "Z5Qb6E1337KbuT3LpGlsbmb1AVAHrg",
"deleted": false
},
{
"id": 6,
"name": "Web Analytics",
"pinned": true,
"items": null,
"created_at": "2021-02-05T13:55:33.570744Z",
"created_by": null,
"is_shared": false,
"share_token": "2sMrL2yoSFgSy-uQLVi48fGKtHvO_A",
"deleted": false
}
]
}

View File

@ -0,0 +1,867 @@
{
"result": [
{
"distinct_id": "01777279-ff1b-0051-1fbd-b89614430f72",
"global_session_id": 13,
"length": 100,
"start_time": "2021-02-04T13:55:33.831566Z",
"end_time": "2021-02-04T13:57:13.831602Z",
"event_count": 6,
"events": [
{
"id": "92b8dee3-e044-4fa8-8ad2-265da5f301c0",
"distinct_id": "01777279-ff1b-0051-1fbd-b89614430f72",
"properties": {},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:33.831566+00:00",
"person": "01777279-ff1b-0051-1fbd-b89614430f72",
"elements": [],
"elements_chain": ""
},
{
"id": "2f98dfd9-36a7-4f21-987f-8ba453594341",
"distinct_id": "01777279-ff1b-0051-1fbd-b89614430f72",
"properties": {},
"event": "installed_app",
"timestamp": "2021-02-04T13:55:33.831583+00:00",
"person": "01777279-ff1b-0051-1fbd-b89614430f72",
"elements": [],
"elements_chain": ""
},
{
"id": "f62c64e0-5d74-4c54-b494-3e352444c70f",
"distinct_id": "01777279-ff1b-0051-1fbd-b89614430f72",
"properties": {
"$current_url": "https://hogflix/settings"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:48.831631+00:00",
"person": "01777279-ff1b-0051-1fbd-b89614430f72",
"elements": [],
"elements_chain": ""
},
{
"id": "0236bc7a-baa0-415d-885e-b1ebb8e6885c",
"distinct_id": "01777279-ff1b-0051-1fbd-b89614430f72",
"properties": {
"$current_url": "https://hogflix/profile"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:56:03.831663+00:00",
"person": "01777279-ff1b-0051-1fbd-b89614430f72",
"elements": [],
"elements_chain": ""
},
{
"id": "12f8baa1-8255-48bc-a9c2-b415ffa621be",
"distinct_id": "01777279-ff1b-0051-1fbd-b89614430f72",
"properties": {
"app_rating": 5
},
"event": "rated_app",
"timestamp": "2021-02-04T13:56:18.831693+00:00",
"person": "01777279-ff1b-0051-1fbd-b89614430f72",
"elements": [],
"elements_chain": ""
},
{
"id": "0f7902bb-53c1-4561-9e4c-12ab3edd6cc2",
"distinct_id": "01777279-ff1b-0051-1fbd-b89614430f72",
"properties": {
"is_first_movie": true
},
"event": "watched_movie",
"timestamp": "2021-02-04T13:57:13.831602+00:00",
"person": "01777279-ff1b-0051-1fbd-b89614430f72",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": null,
"session_recordings": []
},
{
"distinct_id": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"global_session_id": 12,
"length": 100,
"start_time": "2021-02-04T13:55:33.828731Z",
"end_time": "2021-02-04T13:57:13.828767Z",
"event_count": 6,
"events": [
{
"id": "14d08f23-f177-4256-af57-ff1f90e00479",
"distinct_id": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"properties": {},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:33.828731+00:00",
"person": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"elements": [],
"elements_chain": ""
},
{
"id": "ca848c85-ac7e-49c5-b2aa-e010e608eb61",
"distinct_id": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"properties": {},
"event": "installed_app",
"timestamp": "2021-02-04T13:55:33.828749+00:00",
"person": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"elements": [],
"elements_chain": ""
},
{
"id": "1236f274-7cb4-4e63-9d19-18845e304a30",
"distinct_id": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"properties": {
"$current_url": "https://hogflix/profile"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:48.828797+00:00",
"person": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"elements": [],
"elements_chain": ""
},
{
"id": "da806468-62d7-4d87-b5ea-a77659a9605e",
"distinct_id": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"properties": {
"$current_url": "https://hogflix/profile"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:56:03.828827+00:00",
"person": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"elements": [],
"elements_chain": ""
},
{
"id": "e3dd769f-73af-45fb-bc39-760ac991dcda",
"distinct_id": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"properties": {
"app_rating": 3
},
"event": "rated_app",
"timestamp": "2021-02-04T13:56:18.828855+00:00",
"person": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"elements": [],
"elements_chain": ""
},
{
"id": "d625409a-64e6-4887-8657-6083269d520d",
"distinct_id": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"properties": {
"is_first_movie": true
},
"event": "watched_movie",
"timestamp": "2021-02-04T13:57:13.828767+00:00",
"person": "01777279-ff1b-003e-70d7-fd45f1f1f43b",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": null,
"session_recordings": []
},
{
"distinct_id": "01777279-ff1b-0037-1dac-4325a8e58e7e",
"global_session_id": 11,
"length": 100,
"start_time": "2021-02-04T13:55:33.827525Z",
"end_time": "2021-02-04T13:57:13.827565Z",
"event_count": 4,
"events": [
{
"id": "a5cfd3a0-c4fc-41f2-8f10-4559b4e613dc",
"distinct_id": "01777279-ff1b-0037-1dac-4325a8e58e7e",
"properties": {},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:33.827525+00:00",
"person": "01777279-ff1b-0037-1dac-4325a8e58e7e",
"elements": [],
"elements_chain": ""
},
{
"id": "dd13bd2b-54f3-4eaf-b5e8-feb6d3020e34",
"distinct_id": "01777279-ff1b-0037-1dac-4325a8e58e7e",
"properties": {},
"event": "installed_app",
"timestamp": "2021-02-04T13:55:33.827545+00:00",
"person": "01777279-ff1b-0037-1dac-4325a8e58e7e",
"elements": [],
"elements_chain": ""
},
{
"id": "ddb1a1bc-b71e-42dc-abcd-627070d8b003",
"distinct_id": "01777279-ff1b-0037-1dac-4325a8e58e7e",
"properties": {
"$current_url": "https://hogflix/downloads"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:48.827598+00:00",
"person": "01777279-ff1b-0037-1dac-4325a8e58e7e",
"elements": [],
"elements_chain": ""
},
{
"id": "800f1955-37b5-41fa-aa9a-3e11350d64ff",
"distinct_id": "01777279-ff1b-0037-1dac-4325a8e58e7e",
"properties": {
"is_first_movie": false
},
"event": "watched_movie",
"timestamp": "2021-02-04T13:57:13.827565+00:00",
"person": "01777279-ff1b-0037-1dac-4325a8e58e7e",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": null,
"session_recordings": []
},
{
"distinct_id": "01777279-ff1b-0030-2685-ae9e52533421",
"global_session_id": 10,
"length": 100,
"start_time": "2021-02-04T13:55:33.826415Z",
"end_time": "2021-02-04T13:57:13.826452Z",
"event_count": 6,
"events": [
{
"id": "a915f829-9e07-4a89-9de5-15b0193418a4",
"distinct_id": "01777279-ff1b-0030-2685-ae9e52533421",
"properties": {},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:33.826415+00:00",
"person": "01777279-ff1b-0030-2685-ae9e52533421",
"elements": [],
"elements_chain": ""
},
{
"id": "7abb2df7-b80b-4726-86ca-a1f502b9bcdb",
"distinct_id": "01777279-ff1b-0030-2685-ae9e52533421",
"properties": {},
"event": "installed_app",
"timestamp": "2021-02-04T13:55:33.826433+00:00",
"person": "01777279-ff1b-0030-2685-ae9e52533421",
"elements": [],
"elements_chain": ""
},
{
"id": "2089fde6-66cc-4aad-bdfa-1c2addf2995e",
"distinct_id": "01777279-ff1b-0030-2685-ae9e52533421",
"properties": {
"$current_url": "https://hogflix/movies"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:48.826482+00:00",
"person": "01777279-ff1b-0030-2685-ae9e52533421",
"elements": [],
"elements_chain": ""
},
{
"id": "0ee2c625-f39c-4570-93d6-45ad6bd6230a",
"distinct_id": "01777279-ff1b-0030-2685-ae9e52533421",
"properties": {
"$current_url": "https://hogflix/settings"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:56:03.826513+00:00",
"person": "01777279-ff1b-0030-2685-ae9e52533421",
"elements": [],
"elements_chain": ""
},
{
"id": "9c414a92-546f-4eb1-8fad-cedf460acdc0",
"distinct_id": "01777279-ff1b-0030-2685-ae9e52533421",
"properties": {
"app_rating": 4
},
"event": "rated_app",
"timestamp": "2021-02-04T13:56:18.826542+00:00",
"person": "01777279-ff1b-0030-2685-ae9e52533421",
"elements": [],
"elements_chain": ""
},
{
"id": "c39d6e08-00bf-4461-91a9-da9a9efacfac",
"distinct_id": "01777279-ff1b-0030-2685-ae9e52533421",
"properties": {
"is_first_movie": false
},
"event": "watched_movie",
"timestamp": "2021-02-04T13:57:13.826452+00:00",
"person": "01777279-ff1b-0030-2685-ae9e52533421",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": null,
"session_recordings": []
},
{
"distinct_id": "01777279-ff1b-002f-af76-94912ef0e236",
"global_session_id": 9,
"length": 100,
"start_time": "2021-02-04T13:55:33.826316Z",
"end_time": "2021-02-04T13:57:13.826353Z",
"event_count": 4,
"events": [
{
"id": "0ca95c54-495c-463f-beb0-ddc515b8f23e",
"distinct_id": "01777279-ff1b-002f-af76-94912ef0e236",
"properties": {},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:33.826316+00:00",
"person": "01777279-ff1b-002f-af76-94912ef0e236",
"elements": [],
"elements_chain": ""
},
{
"id": "d0cc5ab5-1d45-42bc-805d-aa6608b39fd4",
"distinct_id": "01777279-ff1b-002f-af76-94912ef0e236",
"properties": {},
"event": "installed_app",
"timestamp": "2021-02-04T13:55:33.826334+00:00",
"person": "01777279-ff1b-002f-af76-94912ef0e236",
"elements": [],
"elements_chain": ""
},
{
"id": "bd82e952-41c5-402d-83c8-3bdf9165c05b",
"distinct_id": "01777279-ff1b-002f-af76-94912ef0e236",
"properties": {
"$current_url": "https://hogflix/movies"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:48.826383+00:00",
"person": "01777279-ff1b-002f-af76-94912ef0e236",
"elements": [],
"elements_chain": ""
},
{
"id": "6064b192-a21a-4926-b8c2-8914da275b05",
"distinct_id": "01777279-ff1b-002f-af76-94912ef0e236",
"properties": {
"is_first_movie": false
},
"event": "watched_movie",
"timestamp": "2021-02-04T13:57:13.826353+00:00",
"person": "01777279-ff1b-002f-af76-94912ef0e236",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": null,
"session_recordings": []
},
{
"distinct_id": "01777279-ff1b-000b-980e-815302415c4b",
"global_session_id": 8,
"length": 100,
"start_time": "2021-02-04T13:55:33.820705Z",
"end_time": "2021-02-04T13:57:13.820744Z",
"event_count": 6,
"events": [
{
"id": "fcb860fe-0e4d-49fd-8e85-449667055ddc",
"distinct_id": "01777279-ff1b-000b-980e-815302415c4b",
"properties": {},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:33.820705+00:00",
"person": "01777279-ff1b-000b-980e-815302415c4b",
"elements": [],
"elements_chain": ""
},
{
"id": "1a737a13-72f3-4d22-9364-f1d639716d1e",
"distinct_id": "01777279-ff1b-000b-980e-815302415c4b",
"properties": {},
"event": "installed_app",
"timestamp": "2021-02-04T13:55:33.820724+00:00",
"person": "01777279-ff1b-000b-980e-815302415c4b",
"elements": [],
"elements_chain": ""
},
{
"id": "e533054e-c612-458e-a7e7-5439cb8b58ee",
"distinct_id": "01777279-ff1b-000b-980e-815302415c4b",
"properties": {
"$current_url": "https://hogflix/settings"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:48.820774+00:00",
"person": "01777279-ff1b-000b-980e-815302415c4b",
"elements": [],
"elements_chain": ""
},
{
"id": "755549a9-3f8f-414c-9445-60528e840fa7",
"distinct_id": "01777279-ff1b-000b-980e-815302415c4b",
"properties": {
"$current_url": "https://hogflix/settings"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:56:03.820805+00:00",
"person": "01777279-ff1b-000b-980e-815302415c4b",
"elements": [],
"elements_chain": ""
},
{
"id": "2855d20b-6c70-43c1-821a-4efb5ab3024a",
"distinct_id": "01777279-ff1b-000b-980e-815302415c4b",
"properties": {
"app_rating": 5
},
"event": "rated_app",
"timestamp": "2021-02-04T13:56:18.820835+00:00",
"person": "01777279-ff1b-000b-980e-815302415c4b",
"elements": [],
"elements_chain": ""
},
{
"id": "c3c6e968-5681-4818-9ce6-525af40bd12a",
"distinct_id": "01777279-ff1b-000b-980e-815302415c4b",
"properties": {
"is_first_movie": false
},
"event": "watched_movie",
"timestamp": "2021-02-04T13:57:13.820744+00:00",
"person": "01777279-ff1b-000b-980e-815302415c4b",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": null,
"session_recordings": []
},
{
"distinct_id": "01777279-ff1b-0009-7b14-6ed4c372c531",
"global_session_id": 7,
"length": 100,
"start_time": "2021-02-04T13:55:33.820438Z",
"end_time": "2021-02-04T13:57:13.820478Z",
"event_count": 4,
"events": [
{
"id": "04069abe-e34f-454e-9e93-33c8940113df",
"distinct_id": "01777279-ff1b-0009-7b14-6ed4c372c531",
"properties": {},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:33.820438+00:00",
"person": "01777279-ff1b-0009-7b14-6ed4c372c531",
"elements": [],
"elements_chain": ""
},
{
"id": "caaaea75-2b6c-45bd-ac7b-a2e0b1129afb",
"distinct_id": "01777279-ff1b-0009-7b14-6ed4c372c531",
"properties": {},
"event": "installed_app",
"timestamp": "2021-02-04T13:55:33.820458+00:00",
"person": "01777279-ff1b-0009-7b14-6ed4c372c531",
"elements": [],
"elements_chain": ""
},
{
"id": "272079eb-4631-4594-8d52-b2bd9c7a5fa7",
"distinct_id": "01777279-ff1b-0009-7b14-6ed4c372c531",
"properties": {
"$current_url": "https://hogflix/movies"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:48.820509+00:00",
"person": "01777279-ff1b-0009-7b14-6ed4c372c531",
"elements": [],
"elements_chain": ""
},
{
"id": "24cc492b-e931-43ff-8010-22b0cff3e4ed",
"distinct_id": "01777279-ff1b-0009-7b14-6ed4c372c531",
"properties": {
"is_first_movie": false
},
"event": "watched_movie",
"timestamp": "2021-02-04T13:57:13.820478+00:00",
"person": "01777279-ff1b-0009-7b14-6ed4c372c531",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": null,
"session_recordings": []
},
{
"distinct_id": "01777279-f65b-0004-aed0-c825464180ef",
"global_session_id": 3,
"length": 30,
"start_time": "2021-02-04T13:55:31.579113Z",
"end_time": "2021-02-04T13:56:01.579206Z",
"event_count": 4,
"events": [
{
"id": "403bd5e3-ea96-4ee9-ad0e-4ed349a3571b",
"distinct_id": "01777279-f65b-0004-aed0-c825464180ef",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Chrome",
"$lib": "web"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:31.579113+00:00",
"person": "01777279-f65b-0004-aed0-c825464180ef",
"elements": [],
"elements_chain": ""
},
{
"id": "2417a733-732a-48df-8809-2389ba463673",
"distinct_id": "01777279-f65b-0004-aed0-c825464180ef",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Chrome",
"$lib": "web",
"$event_type": "click"
},
"event": "$autocapture",
"timestamp": "2021-02-04T13:55:45.579137+00:00",
"person": "01777279-f65b-0004-aed0-c825464180ef",
"elements": [],
"elements_chain": ""
},
{
"id": "705a0937-3e36-4441-9efb-52f41fcde031",
"distinct_id": "01777279-f65b-0004-aed0-c825464180ef",
"properties": {
"$current_url": "http://hogflix.com/1",
"$browser": "Chrome",
"$lib": "web",
"$event_type": "click"
},
"event": "$autocapture",
"timestamp": "2021-02-04T13:56:00.579172+00:00",
"person": "01777279-f65b-0004-aed0-c825464180ef",
"elements": [],
"elements_chain": ""
},
{
"id": "8a8f42ec-4c03-4f5d-bac5-1ab3c218da75",
"distinct_id": "01777279-f65b-0004-aed0-c825464180ef",
"properties": {
"$current_url": "http://hogflix.com/2",
"$browser": "Chrome",
"$lib": "web"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:56:01.579206+00:00",
"person": "01777279-f65b-0004-aed0-c825464180ef",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": "hodge.espinoza@cubix.io",
"session_recordings": []
},
{
"distinct_id": "01777279-f65b-000f-53e8-01abaa5b1d86",
"global_session_id": 6,
"length": 14,
"start_time": "2021-02-04T13:55:31.580601Z",
"end_time": "2021-02-04T13:55:45.580629Z",
"event_count": 2,
"events": [
{
"id": "7f2dd92d-1f52-4dfc-afa0-a3072e3b0258",
"distinct_id": "01777279-f65b-000f-53e8-01abaa5b1d86",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Firefox",
"$lib": "web"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:31.580601+00:00",
"person": "01777279-f65b-000f-53e8-01abaa5b1d86",
"elements": [],
"elements_chain": ""
},
{
"id": "85c59877-3c24-4146-8921-f642948cb492",
"distinct_id": "01777279-f65b-000f-53e8-01abaa5b1d86",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Firefox",
"$lib": "web",
"$event_type": "click"
},
"event": "$autocapture",
"timestamp": "2021-02-04T13:55:45.580629+00:00",
"person": "01777279-f65b-000f-53e8-01abaa5b1d86",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": "suzanne.mitchell@gmail.com",
"session_recordings": []
},
{
"distinct_id": "01777279-f65b-000d-8945-d7cea8f0f63b",
"global_session_id": 5,
"length": 14,
"start_time": "2021-02-04T13:55:31.580446Z",
"end_time": "2021-02-04T13:55:45.580496Z",
"event_count": 2,
"events": [
{
"id": "15ef148f-faab-425a-b76c-c854adac3e71",
"distinct_id": "01777279-f65b-000d-8945-d7cea8f0f63b",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Chrome",
"$lib": "web"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:31.580446+00:00",
"person": "01777279-f65b-000d-8945-d7cea8f0f63b",
"elements": [],
"elements_chain": ""
},
{
"id": "0bb2395c-889a-454a-8f4f-e41a211b8d8a",
"distinct_id": "01777279-f65b-000d-8945-d7cea8f0f63b",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Chrome",
"$lib": "web",
"$event_type": "click"
},
"event": "$autocapture",
"timestamp": "2021-02-04T13:55:45.580496+00:00",
"person": "01777279-f65b-000d-8945-d7cea8f0f63b",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": "tara.roth@hotmail.com",
"session_recordings": []
},
{
"distinct_id": "01777279-f65b-0009-a1f3-8d3f02ee499a",
"global_session_id": 4,
"length": 14,
"start_time": "2021-02-04T13:55:31.579976Z",
"end_time": "2021-02-04T13:55:45.580003Z",
"event_count": 2,
"events": [
{
"id": "7057dd43-634c-41a9-adbd-68687ba2c88a",
"distinct_id": "01777279-f65b-0009-a1f3-8d3f02ee499a",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Safari",
"$lib": "web"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:31.579976+00:00",
"person": "01777279-f65b-0009-a1f3-8d3f02ee499a",
"elements": [],
"elements_chain": ""
},
{
"id": "dee7e72b-8061-4ca7-bfee-6475d2d5c770",
"distinct_id": "01777279-f65b-0009-a1f3-8d3f02ee499a",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Safari",
"$lib": "web",
"$event_type": "click"
},
"event": "$autocapture",
"timestamp": "2021-02-04T13:55:45.580003+00:00",
"person": "01777279-f65b-0009-a1f3-8d3f02ee499a",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": "sybil.huber@gmail.com",
"session_recordings": []
},
{
"distinct_id": "01777279-f65a-001e-f914-f106864d9332",
"global_session_id": 2,
"length": 14,
"start_time": "2021-02-04T13:55:31.578682Z",
"end_time": "2021-02-04T13:55:45.578705Z",
"event_count": 2,
"events": [
{
"id": "ee7f83dc-eeed-4156-a156-7e819d103ec7",
"distinct_id": "01777279-f65a-001e-f914-f106864d9332",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Safari",
"$lib": "web"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:31.578682+00:00",
"person": "01777279-f65a-001e-f914-f106864d9332",
"elements": [],
"elements_chain": ""
},
{
"id": "9b278d87-222b-49ad-94b3-9b4569efd726",
"distinct_id": "01777279-f65a-001e-f914-f106864d9332",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Safari",
"$lib": "web",
"$event_type": "click"
},
"event": "$autocapture",
"timestamp": "2021-02-04T13:55:45.578705+00:00",
"person": "01777279-f65a-001e-f914-f106864d9332",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": "palmer.goodman@hotmail.com",
"session_recordings": []
},
{
"distinct_id": "01777279-f65a-0019-3076-d99ce1215ba4",
"global_session_id": 1,
"length": 14,
"start_time": "2021-02-04T13:55:31.578310Z",
"end_time": "2021-02-04T13:55:45.578337Z",
"event_count": 2,
"events": [
{
"id": "1820513f-3be9-4a8f-9341-65b55ebab72d",
"distinct_id": "01777279-f65a-0019-3076-d99ce1215ba4",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Firefox",
"$lib": "web"
},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:31.578310+00:00",
"person": "01777279-f65a-0019-3076-d99ce1215ba4",
"elements": [],
"elements_chain": ""
},
{
"id": "78979184-3c25-42dd-9aed-3399bdca1bbc",
"distinct_id": "01777279-f65a-0019-3076-d99ce1215ba4",
"properties": {
"$current_url": "http://hogflix.com",
"$browser": "Firefox",
"$lib": "web",
"$event_type": "click"
},
"event": "$autocapture",
"timestamp": "2021-02-04T13:55:45.578337+00:00",
"person": "01777279-f65a-0019-3076-d99ce1215ba4",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": "bettie.stone@gmail.com",
"session_recordings": []
},
{
"distinct_id": "0177727a-19eb-001f-0fa4-8e87aa6a1d5b",
"global_session_id": 15,
"length": 0,
"start_time": "2021-02-04T13:55:40.674044Z",
"end_time": "2021-02-04T13:55:40.674063Z",
"event_count": 2,
"events": [
{
"id": "de245db1-2e4c-49a2-a4fa-59afc5ffe228",
"distinct_id": "0177727a-19eb-001f-0fa4-8e87aa6a1d5b",
"properties": {},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:40.674044+00:00",
"person": "0177727a-19eb-001f-0fa4-8e87aa6a1d5b",
"elements": [],
"elements_chain": ""
},
{
"id": "c3166d5d-bb8d-4efd-8a19-38ea6f66a70c",
"distinct_id": "0177727a-19eb-001f-0fa4-8e87aa6a1d5b",
"properties": {
"plan": "standard",
"purchase_value": 13
},
"event": "purchase",
"timestamp": "2021-02-04T13:55:40.674063+00:00",
"person": "0177727a-19eb-001f-0fa4-8e87aa6a1d5b",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": null,
"session_recordings": []
},
{
"distinct_id": "01777279-ff1b-0066-5989-fb1cd49dfc84",
"global_session_id": 14,
"length": 0,
"start_time": "2021-02-04T13:55:33.834478Z",
"end_time": "2021-02-04T13:55:33.834496Z",
"event_count": 2,
"events": [
{
"id": "03e367a2-bd1b-46e2-93c6-accdc29d3212",
"distinct_id": "01777279-ff1b-0066-5989-fb1cd49dfc84",
"properties": {},
"event": "$pageview",
"timestamp": "2021-02-04T13:55:33.834478+00:00",
"person": "01777279-ff1b-0066-5989-fb1cd49dfc84",
"elements": [],
"elements_chain": ""
},
{
"id": "fe2192c4-14d9-4028-ad92-5c6a9b295153",
"distinct_id": "01777279-ff1b-0066-5989-fb1cd49dfc84",
"properties": {},
"event": "installed_app",
"timestamp": "2021-02-04T13:55:33.834496+00:00",
"person": "01777279-ff1b-0066-5989-fb1cd49dfc84",
"elements": [],
"elements_chain": ""
}
],
"properties": {},
"matching_events": [],
"email": null,
"session_recordings": []
}
],
"pagination": {
"offset": 10
}
}

View File

@ -0,0 +1,12 @@
[
{ "name": "is_demo", "count": 160 },
{ "name": "email", "count": 36 },
{ "name": "address", "count": 35 },
{ "name": "name", "count": 35 },
{ "name": "phone", "count": 35 },
{ "name": "$browser", "count": 1 },
{ "name": "$browser_version", "count": 1 },
{ "name": "$initial_referrer", "count": 1 },
{ "name": "$initial_referring_domain", "count": 1 },
{ "name": "$os", "count": 1 }
]

View File

@ -0,0 +1 @@
[]

View File

@ -0,0 +1,118 @@
{
"id": 2,
"organization": "01777279-f5a2-0000-b1d5-dbfc148b9426",
"api_token": "JqcIEQVjX-CxbPiittsio2ZTIB2pHUBmGVGgQE4Io0I",
"app_urls": [],
"name": "HogFlix Demo App",
"slack_incoming_webhook": null,
"event_names": [
"watched_movie",
"installed_app",
"rated_app",
"purchase",
"entered_free_trial",
"$identify",
"$pageview",
"$autocapture",
"personalization skipped",
"insight viewed",
"$pageleave",
"$capture_metrics"
],
"event_properties": [
"$current_url",
"is_first_movie",
"plan",
"first_visit",
"$set",
"$ip",
"$os",
"$browser",
"$host",
"$pathname",
"$browser_version",
"$screen_height",
"$screen_width",
"$lib",
"$lib_version",
"$insert_id",
"$time",
"distinct_id",
"$device_id",
"$initial_referrer",
"$initial_referring_domain",
"$referrer",
"$referring_domain",
"$active_feature_flags",
"$user_id",
"$anon_distinct_id",
"token",
"posthog_version",
"has_slack_webhook",
"$event_type",
"$ce_version",
"is_first_component_load",
"insight",
"display",
"interval",
"filters",
"filters_count",
"events_count",
"actions_count",
"total_event_actions_count",
"phjs-_send_request",
"phjs-_send_request_inflight",
"phjs-capture",
"phjs-batch-enqueue",
"phjs-xhr-response",
"phjs-xhr-response-200",
"phjs-identify",
"phjs-batch-requests",
"phjs-batch-requests-e/",
"phjs-batch-handle",
"phjs-batch-handle-e/",
"phjs-batch-unload-requests",
"phjs-batch-unload-requests-e/",
"phjs-batch-unload",
"phjs-batch-unload-e/"
],
"event_properties_numerical": [
"purchase",
"app_rating",
"purchase_value",
"$browser_version",
"$screen_height",
"$screen_width",
"$time",
"has_slack_webhook",
"$ce_version",
"is_first_component_load",
"filters_count",
"events_count",
"actions_count",
"total_event_actions_count",
"phjs-_send_request",
"phjs-_send_request_inflight",
"phjs-capture",
"phjs-batch-enqueue",
"phjs-xhr-response",
"phjs-xhr-response-200",
"phjs-identify",
"phjs-batch-requests",
"phjs-batch-requests-e/",
"phjs-batch-handle",
"phjs-batch-handle-e/",
"phjs-batch-unload-requests",
"phjs-batch-unload-requests-e/",
"phjs-batch-unload",
"phjs-batch-unload-e/"
],
"created_at": "2021-02-05T13:55:31.489580Z",
"updated_at": "2021-02-05T13:55:52.852345Z",
"anonymize_ips": false,
"completed_snippet_onboarding": true,
"ingested_event": true,
"uuid": "01777279-f621-0000-1c87-13657da18040",
"opt_out_capture": false,
"is_demo": true
}

View File

@ -0,0 +1,24 @@
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "ChromeUsers",
"created_by": {
"id": 2,
"distinct_id": "NFuDfZu5XKan7pDu3wCbvjJbVsoejlG6O6D8VaN96vA",
"first_name": "Karl",
"email": "karl@posthog.com"
},
"created_at": "2021-02-08T08:43:40.744073Z",
"updated_at": "2021-02-08T08:43:40.744112Z",
"filters": {
"properties": [
{ "key": "$browser", "type": "person", "label": "$browser", "value": "Chrome", "operator": "exact" }
]
}
}
]
}

View File

@ -0,0 +1,460 @@
{
"id": 2,
"distinct_id": "NFuDfZu5XKan7pDu3wCbvjJbVsoejlG6O6D8VaN96vA",
"name": "TestUser",
"email": "test@posthog.com",
"email_opt_in": true,
"anonymize_data": false,
"toolbar_mode": "toolbar",
"organization": {
"id": "01777279-f5a2-0000-b1d5-dbfc148b9426",
"name": "Foo",
"billing_plan": null,
"available_features": [],
"created_at": "2021-02-05T13:55:31.362Z",
"updated_at": "2021-02-05T13:55:44.244Z",
"teams": [
{
"id": 2,
"name": "HogFlix Demo App"
}
]
},
"organizations": [
{
"name": "Foo",
"id": "01777279-f5a2-0000-b1d5-dbfc148b9426"
}
],
"team": {
"id": 2,
"name": "HogFlix Demo App",
"app_urls": [],
"api_token": "JqcIEQVjX-CxbPiittsio2ZTIB2pHUBmGVGgQE4Io0I",
"opt_out_capture": false,
"anonymize_ips": false,
"slack_incoming_webhook": null,
"event_names": [
"watched_movie",
"installed_app",
"rated_app",
"purchase",
"entered_free_trial",
"$identify",
"$pageview",
"$autocapture",
"personalization skipped",
"insight viewed",
"$pageleave",
"$capture_metrics"
],
"event_names_with_usage": [
{
"event": "$identify",
"volume": null,
"usage_count": null
},
{
"event": "$pageview",
"volume": null,
"usage_count": null
},
{
"event": "$autocapture",
"volume": null,
"usage_count": null
},
{
"event": "personalization skipped",
"volume": null,
"usage_count": null
},
{
"event": "insight viewed",
"volume": null,
"usage_count": null
},
{
"event": "$pageleave",
"volume": null,
"usage_count": null
},
{
"event": "$capture_metrics",
"volume": null,
"usage_count": null
}
],
"event_properties": [
"$current_url",
"is_first_movie",
"plan",
"first_visit",
"$set",
"$ip",
"$os",
"$browser",
"$host",
"$pathname",
"$browser_version",
"$screen_height",
"$screen_width",
"$lib",
"$lib_version",
"$insert_id",
"$time",
"distinct_id",
"$device_id",
"$initial_referrer",
"$initial_referring_domain",
"$referrer",
"$referring_domain",
"$active_feature_flags",
"$user_id",
"$anon_distinct_id",
"token",
"posthog_version",
"has_slack_webhook",
"$event_type",
"$ce_version",
"is_first_component_load",
"insight",
"display",
"interval",
"filters",
"filters_count",
"events_count",
"actions_count",
"total_event_actions_count",
"phjs-_send_request",
"phjs-_send_request_inflight",
"phjs-capture",
"phjs-batch-enqueue",
"phjs-xhr-response",
"phjs-xhr-response-200",
"phjs-identify",
"phjs-batch-requests",
"phjs-batch-requests-e/",
"phjs-batch-handle",
"phjs-batch-handle-e/",
"phjs-batch-unload-requests",
"phjs-batch-unload-requests-e/",
"phjs-batch-unload",
"phjs-batch-unload-e/"
],
"event_properties_numerical": [
"purchase",
"app_rating",
"purchase_value",
"$browser_version",
"$screen_height",
"$screen_width",
"$time",
"has_slack_webhook",
"$ce_version",
"is_first_component_load",
"filters_count",
"events_count",
"actions_count",
"total_event_actions_count",
"phjs-_send_request",
"phjs-_send_request_inflight",
"phjs-capture",
"phjs-batch-enqueue",
"phjs-xhr-response",
"phjs-xhr-response-200",
"phjs-identify",
"phjs-batch-requests",
"phjs-batch-requests-e/",
"phjs-batch-handle",
"phjs-batch-handle-e/",
"phjs-batch-unload-requests",
"phjs-batch-unload-requests-e/",
"phjs-batch-unload",
"phjs-batch-unload-e/"
],
"event_properties_with_usage": [
{
"key": "$set",
"volume": null,
"usage_count": null
},
{
"key": "$ip",
"volume": null,
"usage_count": null
},
{
"key": "$os",
"volume": null,
"usage_count": null
},
{
"key": "$browser",
"volume": null,
"usage_count": null
},
{
"key": "$host",
"volume": null,
"usage_count": null
},
{
"key": "$pathname",
"volume": null,
"usage_count": null
},
{
"key": "$browser_version",
"volume": null,
"usage_count": null
},
{
"key": "$screen_height",
"volume": null,
"usage_count": null
},
{
"key": "$screen_width",
"volume": null,
"usage_count": null
},
{
"key": "$lib",
"volume": null,
"usage_count": null
},
{
"key": "$lib_version",
"volume": null,
"usage_count": null
},
{
"key": "$insert_id",
"volume": null,
"usage_count": null
},
{
"key": "$time",
"volume": null,
"usage_count": null
},
{
"key": "distinct_id",
"volume": null,
"usage_count": null
},
{
"key": "$device_id",
"volume": null,
"usage_count": null
},
{
"key": "$initial_referrer",
"volume": null,
"usage_count": null
},
{
"key": "$initial_referring_domain",
"volume": null,
"usage_count": null
},
{
"key": "$referrer",
"volume": null,
"usage_count": null
},
{
"key": "$referring_domain",
"volume": null,
"usage_count": null
},
{
"key": "$active_feature_flags",
"volume": null,
"usage_count": null
},
{
"key": "$user_id",
"volume": null,
"usage_count": null
},
{
"key": "$anon_distinct_id",
"volume": null,
"usage_count": null
},
{
"key": "token",
"volume": null,
"usage_count": null
},
{
"key": "posthog_version",
"volume": null,
"usage_count": null
},
{
"key": "has_slack_webhook",
"volume": null,
"usage_count": null
},
{
"key": "$event_type",
"volume": null,
"usage_count": null
},
{
"key": "$ce_version",
"volume": null,
"usage_count": null
},
{
"key": "is_first_component_load",
"volume": null,
"usage_count": null
},
{
"key": "insight",
"volume": null,
"usage_count": null
},
{
"key": "display",
"volume": null,
"usage_count": null
},
{
"key": "interval",
"volume": null,
"usage_count": null
},
{
"key": "filters",
"volume": null,
"usage_count": null
},
{
"key": "filters_count",
"volume": null,
"usage_count": null
},
{
"key": "events_count",
"volume": null,
"usage_count": null
},
{
"key": "actions_count",
"volume": null,
"usage_count": null
},
{
"key": "total_event_actions_count",
"volume": null,
"usage_count": null
},
{
"key": "phjs-_send_request",
"volume": null,
"usage_count": null
},
{
"key": "phjs-_send_request_inflight",
"volume": null,
"usage_count": null
},
{
"key": "phjs-capture",
"volume": null,
"usage_count": null
},
{
"key": "phjs-batch-enqueue",
"volume": null,
"usage_count": null
},
{
"key": "phjs-xhr-response",
"volume": null,
"usage_count": null
},
{
"key": "phjs-xhr-response-200",
"volume": null,
"usage_count": null
},
{
"key": "phjs-identify",
"volume": null,
"usage_count": null
},
{
"key": "phjs-batch-requests",
"volume": null,
"usage_count": null
},
{
"key": "phjs-batch-requests-e/",
"volume": null,
"usage_count": null
},
{
"key": "phjs-batch-handle",
"volume": null,
"usage_count": null
},
{
"key": "phjs-batch-handle-e/",
"volume": null,
"usage_count": null
},
{
"key": "phjs-batch-unload-requests",
"volume": null,
"usage_count": null
},
{
"key": "phjs-batch-unload-requests-e/",
"volume": null,
"usage_count": null
},
{
"key": "phjs-batch-unload",
"volume": null,
"usage_count": null
},
{
"key": "phjs-batch-unload-e/",
"volume": null,
"usage_count": null
}
],
"completed_snippet_onboarding": true,
"session_recording_opt_in": false,
"session_recording_retention_period_days": null,
"plugins_opt_in": false,
"ingested_event": true,
"is_demo": true
},
"teams": [
{
"name": "HogFlix Demo App",
"id": 2
}
],
"has_password": true,
"opt_out_capture": null,
"posthog_version": "1.20.0",
"is_multi_tenancy": false,
"ee_available": true,
"ee_enabled": true,
"email_service_available": false,
"is_debug": true,
"is_staff": false,
"is_impersonated": false,
"plugin_access": {
"install": true,
"configure": true
}
}

View File

@ -1,7 +1,7 @@
describe('Person Visualization Check', () => {
beforeEach(() => {
cy.get('[data-attr=menu-item-persons]').click()
cy.get('.ant-spin-spinning').should('not.visible') // Wait until initial table load to be able to use the search
cy.get('.ant-spin-spinning').should('not.exist') // Wait until initial table load to be able to use the search
cy.get('[data-attr=persons-search]').type('deb').should('have.value', 'deb')
cy.get('.ant-input-search-button').click()
cy.contains('deborah.fernandez@gmail.com').click()
@ -22,7 +22,7 @@ describe('Person Visualization Check', () => {
describe('Person Show All Distinct Checks', () => {
beforeEach(() => {
cy.get('[data-attr=menu-item-persons]').click()
cy.get('.ant-spin-spinning').should('not.visible') // Wait until initial table load
cy.get('.ant-spin-spinning').should('not.exist') // Wait until initial table load
})
it('Should have no Show All Distinct Id Button', () => {

View File

@ -1,4 +1,18 @@
module.exports = (on) => {
// eslint-disable-next-line @typescript-eslint/no-var-requires
require('cypress-terminal-report/src/installLogsPrinter')(on)
const webpackPreprocessor = require('@cypress/webpack-preprocessor')
const { createEntry } = require('../../webpack.config')
module.exports = (on, config) => {
const options = {
webpackOptions: createEntry('cypress'),
watchOptions: {},
}
on('file:preprocessor', webpackPreprocessor(options))
try {
// eslint-disable-next-line @typescript-eslint/no-var-requires
require('cypress-terminal-report/src/installLogsPrinter')(on)
} catch (e) {}
return config
}

View File

@ -0,0 +1,9 @@
Cypress.Commands.add('interceptLazy', (pattern, handler) => {
return cy.intercept(pattern, (req) => {
req.reply(handler())
})
})
Cypress.Commands.add('map', { prevSubject: true }, (subject, method) => {
return method(subject)
})

View File

@ -0,0 +1,39 @@
import React from 'react'
import { mount } from '@cypress/react'
import { Provider } from 'react-redux'
import { getContext } from 'kea'
import { initKea } from '~/initKea'
import { GlobalStyles } from '~/GlobalStyles'
import posthog from 'posthog-js'
export const mountPage = (component) => {
initKea()
return mount(
<Provider store={getContext().store}>
<GlobalStyles />
{component}
</Provider>
)
}
export const setLocation = (path) => {
window.history.replaceState(null, '', path)
}
export const getSearchParameters = ({ request }) => {
const searchParams = new URL(request.url).searchParams
const result = {}
for (const [key, value] of searchParams.entries()) {
result[key] = value
}
return result
}
export const mockPosthog = () => {
cy.stub(posthog)
posthog.people = { set: () => {} }
posthog.onFeatureFlags = (callback) => {
callback(given.featureFlags || [])
}
}

View File

@ -1,16 +1,33 @@
import '@cypress/react/support'
import 'givens/setup'
import './commands'
// eslint-disable-next-line @typescript-eslint/no-var-requires
require('cypress-terminal-report/src/installLogsCollector')()
import { unmount } from '@cypress/react'
try {
// eslint-disable-next-line @typescript-eslint/no-var-requires
require('cypress-terminal-report/src/installLogsCollector')()
} catch {}
beforeEach(() => {
cy.visit('/')
if (Cypress.spec.specType === 'component') {
// Freeze time to 2021.01.05 Noon UTC - this should be the same date regardless of timezone.
cy.clock(1578225600000, ['Date'])
} else {
cy.visit('/')
cy.url().then((url) => {
if (url.includes('login')) {
logIn()
}
})
cy.url().then((url) => {
if (url.includes('login')) {
logIn()
}
})
}
})
afterEach(() => {
if (Cypress.spec.specType === 'component') {
unmount()
}
})
const logIn = () => {

View File

@ -0,0 +1,7 @@
import '~/global.scss' /* Contains PostHog's main styling configurations */
import '~/antd.less' /* Imports Ant Design's components */
import './style.scss' /* DEPRECATED */
export function GlobalStyles(): null {
return null
}

View File

@ -1,6 +1,3 @@
import '~/global.scss' /* Contains PostHog's main styling configurations */
import '~/antd.less' /* Imports Ant Design's components */
import './style.scss' /* DEPRECATED */
import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
@ -10,12 +7,14 @@ import { App } from 'scenes/App'
import { initKea } from './initKea'
import { loadPostHogJS } from './loadPostHogJS'
import { GlobalStyles } from './GlobalStyles'
loadPostHogJS()
initKea()
ReactDOM.render(
<Provider store={getContext().store}>
<GlobalStyles />
<App />
</Provider>,
document.getElementById('root')

View File

@ -32,22 +32,28 @@ describe('formatLabel()', () => {
expect(given.subject).toEqual('some_event (Total) ')
})
it('handles DAU queries', () => {
describe('DAU queries', () => {
given('action', () => ({ math: 'dau' }))
expect(given.subject).toEqual('some_event (DAU) ')
it('is formatted', () => {
expect(given.subject).toEqual('some_event (DAU) ')
})
})
it('handles summing by property', () => {
describe('summing by property', () => {
given('action', () => ({ math: 'sum', math_property: 'event_property' }))
expect(given.subject).toEqual('some_event (sum of event_property) ')
it('is formatted', () => {
expect(given.subject).toEqual('some_event (sum of event_property) ')
})
})
it('handles action with properties', () => {
describe('action with properties', () => {
given('action', () => ({ properties: [{ value: 'hello' }, { operator: 'gt', value: 5 }] }))
expect(given.subject).toEqual('some_event (Total) (= hello, > 5)')
it('is formatted', () => {
expect(given.subject).toEqual('some_event (Total) (= hello, > 5)')
})
})
})

View File

@ -51,47 +51,53 @@ describe('createActionFromEvent()', () => {
expect(toast.mock.calls).toMatchSnapshot()
})
it('handles increments', async () => {
describe('increments', () => {
given('increment', () => 4)
await given.subject()
it('handles increments', async () => {
await given.subject()
expect(api.create).toHaveBeenCalledWith('api/action', {
name: 'some-event event 4',
steps: [{ event: 'some-event', url: 'http://foo.bar/some/path', url_matching: 'exact' }],
expect(api.create).toHaveBeenCalledWith('api/action', {
name: 'some-event event 4',
steps: [{ event: 'some-event', url: 'http://foo.bar/some/path', url_matching: 'exact' }],
})
})
})
it('handles submit $autocapture events with elements', async () => {
describe('$autocapture events', () => {
given('eventName', () => '$autocapture')
given('eventType', () => 'submit')
given('elements', () => [{ tag_name: 'form', text: 'Submit form!' }, {}])
await given.subject()
it('handles submit $autocapture events with elements', async () => {
await given.subject()
expect(api.create).toHaveBeenCalledWith('api/action', {
name: 'submitted form with text "Submit form!"',
steps: [
{
event: '$autocapture',
url: 'http://foo.bar/some/path',
url_matching: 'exact',
tag_name: 'form',
text: 'Submit form!',
properties: [{ key: '$event_type', value: 'submit' }],
},
],
expect(api.create).toHaveBeenCalledWith('api/action', {
name: 'submitted form with text "Submit form!"',
steps: [
{
event: '$autocapture',
url: 'http://foo.bar/some/path',
url_matching: 'exact',
tag_name: 'form',
text: 'Submit form!',
properties: [{ key: '$event_type', value: 'submit' }],
},
],
})
})
})
it('handles $pageview events', async () => {
describe('$pageview event', () => {
given('eventName', () => '$pageview')
await given.subject()
it('is handled', async () => {
await given.subject()
expect(api.create).toHaveBeenCalledWith('api/action', {
name: 'Pageview on /some/path',
steps: [{ event: '$pageview', url: 'http://foo.bar/some/path', url_matching: 'exact' }],
expect(api.create).toHaveBeenCalledWith('api/action', {
name: 'Pageview on /some/path',
steps: [{ event: '$pageview', url: 'http://foo.bar/some/path', url_matching: 'exact' }],
})
})
})
})
@ -110,13 +116,15 @@ describe('createActionFromEvent()', () => {
expect(toast).not.toHaveBeenCalled()
})
it('stops recursion if increment == 30', async () => {
describe('increment == 30', () => {
given('increment', () => 30)
await given.subject()
it('stops recursion', async () => {
await given.subject()
expect(given.recurse).not.toHaveBeenCalled()
expect(toast).not.toHaveBeenCalled()
expect(given.recurse).not.toHaveBeenCalled()
expect(toast).not.toHaveBeenCalled()
})
})
})
})

View File

@ -0,0 +1,94 @@
import React from 'react'
import { Sessions } from './Sessions'
import * as helpers from 'cypress/support/helpers'
describe('<Sessions />', () => {
const mount = () => helpers.mountPage(<Sessions />)
beforeEach(() => {
cy.intercept('/api/user/', { fixture: 'api/user' })
cy.intercept('/api/dashboard/', { fixture: 'api/dashboard' })
cy.intercept('/api/personal_api_keys/', { fixture: 'api/personal_api_keys' })
cy.intercept('/api/projects/@current/', { fixture: 'api/projects/@current' })
cy.intercept('/api/person/properties/', { fixture: 'api/person/properties' })
cy.interceptLazy('/api/event/sessions/', () => given.sessions).as('api_sessions')
helpers.mockPosthog()
helpers.setLocation('/sessions')
})
given('featureFlags', () => ['filter_by_session_props'])
given('sessions', () => ({ fixture: 'api/event/sessions/demo_sessions' }))
it('can navigate within sessions page', () => {
mount()
cy.contains('Sessions').should('be.visible')
cy.wait('@api_sessions').map(helpers.getSearchParameters).should('include', {
date_from: '2020-01-05',
date_to: '2020-01-05',
distinct_id: '',
filters: '[]',
offset: '0',
properties: '[]',
})
cy.log('Play all disabled')
cy.get('[data-attr="play-all-recordings"]').should('have.attr', 'disabled')
cy.log('Load more should work')
cy.get('[data-attr="load-more-sessions"]').click()
cy.wait('@api_sessions')
.map(helpers.getSearchParameters)
.should('include', {
date_from: '2020-01-05',
date_to: '2020-01-05',
pagination: JSON.stringify({ offset: 10 }),
})
cy.get('[data-attr="sessions-prev-date"]').click()
cy.wait('@api_sessions').map(helpers.getSearchParameters).should('include', {
date_from: '2020-01-04',
date_to: '2020-01-04',
})
})
it('can filter sessions', () => {
mount()
cy.wait('@api_sessions')
cy.get('[data-attr="sessions-filter-open"]').click()
cy.focused().type('br').type('{downarrow}').type('{enter}')
cy.get('.sessions-filter-row input').last().type('Chrome').type('{enter}')
cy.contains('There are unapplied filters').should('be.visible')
cy.get('[data-attr="sessions-apply-filters"]').click()
cy.contains('There are unapplied filters').should('not.exist')
cy.wait('@api_sessions').map(helpers.getSearchParameters).should('include', {
filters: '[{"type":"person","key":"$browser","value":"Chrome","label":"$browser","operator":"exact"}]',
})
})
describe('sessions filters', () => {
beforeEach(() => {
cy.intercept('/api/sessions_filter/', { fixture: 'api/sessions_filter' }).as('sessions_filter')
})
it('renders sessions filters', () => {
mount()
cy.wait('@api_sessions')
cy.wait('@sessions_filter')
cy.contains('Unseen recordings').should('be.visible')
cy.contains('ChromeUsers').should('be.visible')
cy.get('[data-attr="sessions-filter-link"]').last().click()
cy.wait('@api_sessions')
cy.get('@api_sessions').map(helpers.getSearchParameters).should('include', {
filters: '[{"key":"$browser","type":"person","label":"$browser","value":"Chrome","operator":"exact"}]',
})
})
})
})

View File

@ -174,9 +174,9 @@ export function SessionsView({ personIds, isPersonPage = false }: SessionsTableP
return (
<div className="events" data-attr="events-table">
<Space className="mb-05">
<Button onClick={previousDay} icon={<CaretLeftOutlined />} />
<Button onClick={previousDay} icon={<CaretLeftOutlined />} data-attr="sessions-prev-date" />
<DatePicker value={selectedDate} onChange={(date) => setFilters(properties, date)} allowClear={false} />
<Button onClick={nextDay} icon={<CaretRightOutlined />} />
<Button onClick={nextDay} icon={<CaretRightOutlined />} data-attr="sessions-next-date" />
</Space>
{featureFlags['filter_by_session_props'] && (
@ -234,7 +234,7 @@ export function SessionsView({ personIds, isPersonPage = false }: SessionsTableP
}}
>
{(pagination || isLoadingNext) && (
<Button type="primary" onClick={fetchNextSessions}>
<Button type="primary" onClick={fetchNextSessions} data-attr="load-more-sessions">
{isLoadingNext ? <Spin> </Spin> : 'Load more sessions'}
</Button>
)}

View File

@ -132,7 +132,7 @@ export function EditFiltersPanel({ onSubmit }: Props): JSX.Element | null {
<SaveOutlined /> Save filter
</span>
</Button>
<Button type="primary" onClick={onSubmit}>
<Button type="primary" onClick={onSubmit} data-attr="sessions-apply-filters">
<span>
<SearchOutlined /> Apply filters
</span>

View File

@ -129,7 +129,7 @@ export default {
// setupFiles: [],
// A list of paths to modules that run some code to configure or set up the testing framework before each test
setupFilesAfterEnv: ['given2/setup'],
setupFilesAfterEnv: ['givens/setup'],
// The number of seconds after which a test is considered as slow and reported as such in the results.
// slowTestThreshold: 5,

View File

@ -86,6 +86,8 @@
"@babel/plugin-transform-runtime": "^7.10.4",
"@babel/preset-env": "7.10.4",
"@babel/preset-typescript": "^7.10.4",
"@cypress/react": "^4.16.4",
"@cypress/webpack-preprocessor": "^5.5.0",
"@hot-loader/react-dom": "^16.13.0",
"@types/jest": "^26.0.15",
"@types/react": "^16.14.2",
@ -109,7 +111,7 @@
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-react": "^7.20.3",
"file-loader": "^6.1.0",
"given2": "^2.1.7",
"givens": "^1.3.6",
"html-webpack-harddisk-plugin": "^1.0.1",
"html-webpack-plugin": "^4.4.1",
"husky": "^4.3.0",

View File

@ -9,11 +9,6 @@ const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin')
const webpackDevServerHost = process.env.WEBPACK_HOT_RELOAD_HOST || '127.0.0.1'
const webpackDevServerFrontendAddr = webpackDevServerHost === '0.0.0.0' ? '127.0.0.1' : webpackDevServerHost
// main = app
// toolbar = toolbar
// shared_dashboard = publicly available dashboard
module.exports = () => [createEntry('main'), createEntry('toolbar'), createEntry('shared_dashboard')]
function createEntry(entry) {
const commonLoadersForSassAndLess = [
entry === 'toolbar'
@ -33,6 +28,10 @@ function createEntry(entry) {
},
},
}
: entry === 'cypress'
? {
loader: 'style-loader',
}
: {
// After all CSS loaders we use plugin to do his work.
// It gets all transformed CSS and extracts it into separate
@ -55,7 +54,7 @@ function createEntry(entry) {
devtool: process.env.NODE_ENV === 'production' ? 'source-map' : 'inline-source-map',
entry: {
[entry]:
entry === 'main'
entry === 'main' || entry === 'cypress'
? './frontend/src/index.tsx'
: entry === 'toolbar'
? './frontend/src/toolbar/index.tsx'
@ -85,6 +84,7 @@ function createEntry(entry) {
scenes: path.resolve(__dirname, 'frontend', 'src', 'scenes'),
types: path.resolve(__dirname, 'frontend', 'types'),
public: path.resolve(__dirname, 'frontend', 'public'),
cypress: path.resolve(__dirname, 'cypress'),
...(process.env.NODE_ENV !== 'production'
? {
'react-dom': '@hot-loader/react-dom',
@ -239,7 +239,15 @@ function createEntry(entry) {
}),
new HtmlWebpackHarddiskPlugin(),
]
: entry === 'cypress'
? [new HtmlWebpackHarddiskPlugin()]
: []
),
}
}
// main = app
// toolbar = toolbar
// shared_dashboard = publicly available dashboard
module.exports = () => [createEntry('main'), createEntry('toolbar'), createEntry('shared_dashboard')]
module.exports.createEntry = createEntry

1827
yarn.lock

File diff suppressed because it is too large Load Diff