mirror of
https://github.com/PostHog/posthog.git
synced 2024-12-01 12:21:02 +01:00
bcffcde783
* add a test to make sure funnel cohort persons is returned * delete comment * checking persons on cohort return in original test
248 lines
9.6 KiB
Python
248 lines
9.6 KiB
Python
from uuid import uuid4
|
|
|
|
from ee.clickhouse.models.event import create_event
|
|
from ee.clickhouse.queries.funnels.funnel import ClickhouseFunnel
|
|
from ee.clickhouse.queries.funnels.funnel_persons import ClickhouseFunnelPersons
|
|
from ee.clickhouse.util import ClickhouseTestMixin
|
|
from posthog.constants import INSIGHT_FUNNELS
|
|
from posthog.models import Cohort, Filter
|
|
from posthog.models.person import Person
|
|
from posthog.test.base import APIBaseTest
|
|
|
|
FORMAT_TIME = "%Y-%m-%d 00:00:00"
|
|
MAX_STEP_COLUMN = 0
|
|
COUNT_COLUMN = 1
|
|
PERSON_ID_COLUMN = 2
|
|
|
|
|
|
def _create_person(**kwargs):
|
|
person = Person.objects.create(**kwargs)
|
|
return Person(id=person.uuid, uuid=person.uuid)
|
|
|
|
|
|
def _create_event(**kwargs):
|
|
kwargs.update({"event_uuid": uuid4()})
|
|
create_event(**kwargs)
|
|
|
|
|
|
class TestFunnelPersons(ClickhouseTestMixin, APIBaseTest):
|
|
def _create_sample_data_multiple_dropoffs(self):
|
|
for i in range(5):
|
|
_create_person(distinct_ids=[f"user_{i}"], team=self.team)
|
|
_create_event(event="step one", distinct_id=f"user_{i}", team=self.team, timestamp="2021-05-01 00:00:00")
|
|
_create_event(event="step two", distinct_id=f"user_{i}", team=self.team, timestamp="2021-05-03 00:00:00")
|
|
_create_event(event="step three", distinct_id=f"user_{i}", team=self.team, timestamp="2021-05-05 00:00:00")
|
|
|
|
for i in range(5, 15):
|
|
_create_person(distinct_ids=[f"user_{i}"], team=self.team)
|
|
_create_event(event="step one", distinct_id=f"user_{i}", team=self.team, timestamp="2021-05-01 00:00:00")
|
|
_create_event(event="step two", distinct_id=f"user_{i}", team=self.team, timestamp="2021-05-03 00:00:00")
|
|
|
|
for i in range(15, 35):
|
|
_create_person(distinct_ids=[f"user_{i}"], team=self.team)
|
|
_create_event(event="step one", distinct_id=f"user_{i}", team=self.team, timestamp="2021-05-01 00:00:00")
|
|
|
|
def test_first_step(self):
|
|
self._create_sample_data_multiple_dropoffs()
|
|
data = {
|
|
"insight": INSIGHT_FUNNELS,
|
|
"interval": "day",
|
|
"date_from": "2021-05-01 00:00:00",
|
|
"date_to": "2021-05-07 00:00:00",
|
|
"funnel_window_days": 7,
|
|
"funnel_step": 1,
|
|
"events": [
|
|
{"id": "step one", "order": 0},
|
|
{"id": "step two", "order": 1},
|
|
{"id": "step three", "order": 2},
|
|
],
|
|
}
|
|
filter = Filter(data=data)
|
|
results = ClickhouseFunnelPersons(filter, self.team)._exec_query()
|
|
self.assertEqual(35, len(results))
|
|
|
|
def test_last_step(self):
|
|
self._create_sample_data_multiple_dropoffs()
|
|
data = {
|
|
"insight": INSIGHT_FUNNELS,
|
|
"interval": "day",
|
|
"date_from": "2021-05-01 00:00:00",
|
|
"date_to": "2021-05-07 00:00:00",
|
|
"funnel_window_days": 7,
|
|
"funnel_step": 3,
|
|
"events": [
|
|
{"id": "step one", "order": 0},
|
|
{"id": "step two", "order": 1},
|
|
{"id": "step three", "order": 2},
|
|
],
|
|
}
|
|
filter = Filter(data=data)
|
|
results = ClickhouseFunnelPersons(filter, self.team)._exec_query()
|
|
self.assertEqual(5, len(results))
|
|
|
|
def test_second_step_dropoff(self):
|
|
self._create_sample_data_multiple_dropoffs()
|
|
data = {
|
|
"insight": INSIGHT_FUNNELS,
|
|
"interval": "day",
|
|
"date_from": "2021-05-01 00:00:00",
|
|
"date_to": "2021-05-07 00:00:00",
|
|
"funnel_window_days": 7,
|
|
"funnel_step": -2,
|
|
"events": [
|
|
{"id": "step one", "order": 0},
|
|
{"id": "step two", "order": 1},
|
|
{"id": "step three", "order": 2},
|
|
],
|
|
}
|
|
filter = Filter(data=data)
|
|
results = ClickhouseFunnelPersons(filter, self.team)._exec_query()
|
|
self.assertEqual(20, len(results))
|
|
|
|
def test_last_step_dropoff(self):
|
|
self._create_sample_data_multiple_dropoffs()
|
|
data = {
|
|
"insight": INSIGHT_FUNNELS,
|
|
"interval": "day",
|
|
"date_from": "2021-05-01 00:00:00",
|
|
"date_to": "2021-05-07 00:00:00",
|
|
"funnel_window_days": 7,
|
|
"funnel_step": -3,
|
|
"events": [
|
|
{"id": "step one", "order": 0},
|
|
{"id": "step two", "order": 1},
|
|
{"id": "step three", "order": 2},
|
|
],
|
|
}
|
|
filter = Filter(data=data)
|
|
results = ClickhouseFunnelPersons(filter, self.team)._exec_query()
|
|
self.assertEqual(10, len(results))
|
|
|
|
def _create_sample_data(self):
|
|
for i in range(250):
|
|
_create_person(distinct_ids=[f"user_{i}"], team=self.team)
|
|
_create_event(event="step one", distinct_id=f"user_{i}", team=self.team, timestamp="2021-05-01 00:00:00")
|
|
_create_event(event="step two", distinct_id=f"user_{i}", team=self.team, timestamp="2021-05-03 00:00:00")
|
|
_create_event(event="step three", distinct_id=f"user_{i}", team=self.team, timestamp="2021-05-05 00:00:00")
|
|
|
|
def test_basic_offset(self):
|
|
self._create_sample_data()
|
|
data = {
|
|
"insight": INSIGHT_FUNNELS,
|
|
"interval": "day",
|
|
"date_from": "2021-05-01 00:00:00",
|
|
"date_to": "2021-05-07 00:00:00",
|
|
"funnel_window_days": 7,
|
|
"funnel_step": 1,
|
|
"events": [
|
|
{"id": "step one", "order": 0},
|
|
{"id": "step two", "order": 1},
|
|
{"id": "step three", "order": 2},
|
|
],
|
|
}
|
|
|
|
filter = Filter(data=data)
|
|
results = ClickhouseFunnelPersons(filter, self.team)._exec_query()
|
|
self.assertEqual(100, len(results))
|
|
|
|
filter_offset = Filter(data={**data, "offset": 100,})
|
|
results = ClickhouseFunnelPersons(filter_offset, self.team).run()
|
|
self.assertEqual(100, len(results))
|
|
|
|
filter_offset = Filter(data={**data, "offset": 200,})
|
|
results = ClickhouseFunnelPersons(filter_offset, self.team).run()
|
|
self.assertEqual(50, len(results))
|
|
|
|
def test_first_step_breakdowns(self):
|
|
|
|
person1 = _create_person(distinct_ids=["person1"], team_id=self.team.pk)
|
|
_create_event(
|
|
team=self.team,
|
|
event="sign up",
|
|
distinct_id="person1",
|
|
properties={"key": "val", "$browser": "Chrome"},
|
|
timestamp="2020-01-01T12:00:00Z",
|
|
)
|
|
_create_event(
|
|
team=self.team,
|
|
event="play movie",
|
|
distinct_id="person1",
|
|
properties={"key": "val", "$browser": "Chrome"},
|
|
timestamp="2020-01-01T13:00:00Z",
|
|
)
|
|
_create_event(
|
|
team=self.team,
|
|
event="buy",
|
|
distinct_id="person1",
|
|
properties={"key": "val", "$browser": "Chrome"},
|
|
timestamp="2020-01-01T15:00:00Z",
|
|
)
|
|
|
|
person2 = _create_person(distinct_ids=["person2"], team_id=self.team.pk)
|
|
_create_event(
|
|
team=self.team,
|
|
event="sign up",
|
|
distinct_id="person2",
|
|
properties={"key": "val", "$browser": "Safari"},
|
|
timestamp="2020-01-02T14:00:00Z",
|
|
)
|
|
_create_event(
|
|
team=self.team,
|
|
event="play movie",
|
|
distinct_id="person2",
|
|
properties={"key": "val", "$browser": "Safari"},
|
|
timestamp="2020-01-02T16:00:00Z",
|
|
)
|
|
|
|
data = {
|
|
"insight": INSIGHT_FUNNELS,
|
|
"date_from": "2020-01-01",
|
|
"date_to": "2020-01-08",
|
|
"interval": "day",
|
|
"funnel_window_days": 7,
|
|
"funnel_step": 1,
|
|
"events": [{"id": "sign up", "order": 0}, {"id": "play movie", "order": 1}, {"id": "buy", "order": 2},],
|
|
"breakdown_type": "event",
|
|
"breakdown": "$browser",
|
|
}
|
|
filter = Filter(data=data)
|
|
results = ClickhouseFunnelPersons(filter, self.team)._exec_query()
|
|
|
|
self.assertCountEqual([val[0] for val in results], [person1.uuid, person2.uuid])
|
|
|
|
results = ClickhouseFunnelPersons(
|
|
filter.with_data({"funnel_step_breakdown": "Chrome"}), self.team
|
|
)._exec_query()
|
|
print(results)
|
|
self.assertCountEqual([val[0] for val in results], [person1.uuid])
|
|
|
|
results = ClickhouseFunnelPersons(
|
|
filter.with_data({"funnel_step_breakdown": "Safari"}), self.team
|
|
)._exec_query()
|
|
self.assertCountEqual([val[0] for val in results], [person2.uuid])
|
|
|
|
results = ClickhouseFunnelPersons(
|
|
filter.with_data({"funnel_step_breakdown": "Safari, Chrome"}), self.team
|
|
)._exec_query()
|
|
self.assertCountEqual([val[0] for val in results], [person2.uuid, person1.uuid])
|
|
|
|
def test_funnel_cohort_breakdown_persons(self):
|
|
person = _create_person(distinct_ids=[f"person1"], team_id=self.team.pk, properties={"key": "value"})
|
|
_create_event(
|
|
team=self.team, event="sign up", distinct_id=f"person1", properties={}, timestamp="2020-01-02T12:00:00Z",
|
|
)
|
|
cohort = Cohort.objects.create(team=self.team, name="test_cohort", groups=[{"properties": {"key": "value"}}])
|
|
filters = {
|
|
"events": [{"id": "sign up", "order": 0}, {"id": "play movie", "order": 1}, {"id": "buy", "order": 2},],
|
|
"insight": INSIGHT_FUNNELS,
|
|
"date_from": "2020-01-01",
|
|
"date_to": "2020-01-08",
|
|
"funnel_window_days": 7,
|
|
"funnel_step": 1,
|
|
"breakdown_type": "cohort",
|
|
"breakdown": [cohort.pk],
|
|
}
|
|
filter = Filter(data=filters)
|
|
results = ClickhouseFunnelPersons(filter, self.team)._exec_query()
|
|
self.assertEqual(results[0][0], person.uuid)
|