def test_no_event_in_period(self): _create_person(distinct_ids=["user a"], team=self.team) _create_event(event="step one", distinct_id="user a", team=self.team, timestamp="2021-06-06 21:00:00") filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-06-07 00:00:00", "date_to": "2021-06-13 23:59:59", "funnel_window_days": 7, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) funnel_trends = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnel) results = funnel_trends._exec_query() formatted_results = funnel_trends._format_results(results) self.assertEqual(len(results), 7) self.assertEqual(formatted_results[0]["days"][0], "2021-06-07")
def test_incomplete_status(self): today = datetime.utcnow().strftime(FORMAT_TIME) tomorrow_delta = datetime.utcnow() + timedelta(days=1) tomorrow = tomorrow_delta.strftime(FORMAT_TIME) filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": today, "date_to": tomorrow, "funnel_window_days": 1, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results = ClickhouseFunnelTrends(filter, self.team).perform_query() current = results[0] # today self.assertEqual(1, current["completed_funnels"]) self.assertEqual(1, current["total"]) self.assertEqual(100.00, current["percent_complete"]) self.assertEqual(False, current["is_complete"]) self.assertEqual(1, len(current["cohort"]))
def test_steps_performed_in_period_but_in_reverse(self): _create_person(distinct_ids=["user_one"], team=self.team) _create_event(event="step three", distinct_id="user_one", team=self.team, timestamp="2021-05-01 01:00:00") _create_event(event="step two", distinct_id="user_one", team=self.team, timestamp="2021-05-01 02:00:00") _create_event(event="step one", distinct_id="user_one", team=self.team, timestamp="2021-05-01 03:00:00") filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-05-01 00:00:00", "date_to": "2021-05-01 23:59:59", "funnel_window_days": 1, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnel)._exec_query() self.assertEqual(len(results), 1) day_1 = results[0] # 2021-05-01 self.assertEqual(day_1["reached_from_step_count"], 1) self.assertEqual(day_1["reached_to_step_count"], 0) self.assertEqual(day_1["conversion_rate"], 0) self.assertEqual(day_1["is_period_final"], True)
def test_month_interval(self): filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "month", "date_from": "2021-05-01 00:00:00", "date_to": "2021-05-07 00:00:00", "funnel_window_days": 7, "events": [ { "id": "step one", "order": 0 }, { "id": "step two", "order": 1 }, { "id": "step three", "order": 2 }, ], }) results = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnel).perform_query() self.assertEqual(len(results), 1)
def test_period_not_final(self): now = datetime.now() _create_person(distinct_ids=["user_eight"], team=self.team) _create_event(event="step one", distinct_id="user_eight", team=self.team, timestamp=now.strftime(FORMAT_TIME)) _create_event( event="step two", distinct_id="user_eight", team=self.team, timestamp=(now + timedelta(minutes=1)).strftime(FORMAT_TIME), ) _create_event( event="step three", distinct_id="user_eight", team=self.team, timestamp=(now + timedelta(minutes=2)).strftime(FORMAT_TIME), ) filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": (now - timedelta(1)).strftime(FORMAT_TIME), "date_to": now.strftime(FORMAT_TIME_DAY_END), "funnel_window_days": 1, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnel)._exec_query() self.assertEqual(len(results), 2) day = results[0] # yesterday self.assertEqual(day["reached_from_step_count"], 0) self.assertEqual(day["reached_to_step_count"], 0) self.assertEqual(day["conversion_rate"], 0) self.assertEqual( day["timestamp"].replace(tzinfo=pytz.UTC), (datetime(now.year, now.month, now.day) - timedelta(1)).replace(tzinfo=pytz.UTC), ) self.assertEqual(day["is_period_final"], True) # this window can't be affected anymore day = results[1] # today self.assertEqual(day["reached_from_step_count"], 1) self.assertEqual(day["reached_to_step_count"], 1) self.assertEqual(day["conversion_rate"], 100) self.assertEqual( day["timestamp"].replace(tzinfo=pytz.UTC), datetime(now.year, now.month, now.day).replace(tzinfo=pytz.UTC) ) self.assertEqual(day["is_period_final"], False) # events coming in now may stil affect this
def test_to_second_step(self): _create_person(distinct_ids=["user_one"], team=self.team) _create_person(distinct_ids=["user_two"], team=self.team) _create_person(distinct_ids=["user_three"], team=self.team) _create_person(distinct_ids=["user_four"], team=self.team) # 1st user's complete run - should fall into the 2021-05-01 bucket _create_event(event="step one", distinct_id="user_one", team=self.team, timestamp="2021-05-01 01:00:00") _create_event(event="step two", distinct_id="user_one", team=self.team, timestamp="2021-05-02 02:00:00") _create_event(event="step three", distinct_id="user_one", team=self.team, timestamp="2021-05-02 03:00:00") # 2nd user's incomplete run - should count as incomplete _create_event(event="step one", distinct_id="user_two", team=self.team, timestamp="2021-05-01 01:00:00") # 3rd user's incomplete run - should not count at all since reaching 2nd step BUT not the 1st one _create_event(event="step two", distinct_id="user_three", team=self.team, timestamp="2021-05-02 02:00:00") _create_event(event="step three", distinct_id="user_three", team=self.team, timestamp="2021-05-02 03:00:00") # 4th user's incomplete run - should fall into the 2021-05-02 bucket as entered and completed _create_event(event="step one", distinct_id="user_four", team=self.team, timestamp="2021-05-02 01:00:00") _create_event(event="step two", distinct_id="user_four", team=self.team, timestamp="2021-05-02 02:00:00") filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-05-01 00:00:00", "date_to": "2021-05-02 23:59:59", "funnel_window_days": 3, "funnel_to_step": 1, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnel)._exec_query() self.assertEqual(len(results), 2) day_1 = results[0] # 2021-05-01 self.assertEqual(day_1["reached_from_step_count"], 2) self.assertEqual(day_1["reached_to_step_count"], 1) self.assertEqual(day_1["conversion_rate"], 50) self.assertEqual(day_1["is_period_final"], True) day_2 = results[1] # 2021-05-02 self.assertEqual(day_2["reached_from_step_count"], 1) self.assertEqual(day_2["reached_to_step_count"], 1) self.assertEqual(day_2["conversion_rate"], 100) self.assertEqual(day_2["is_period_final"], True)
def test_window_size_one_day_not_broken_by_breakdown(self): self._create_sample_data() filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-05-01 00:00:00", "date_to": "2021-05-07 00:00:00", "funnel_window_days": 1, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnel)._exec_query() filter_breakdown = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-05-01 00:00:00", "date_to": "2021-05-07 00:00:00", "funnel_window_days": 1, "breakdown": "x", "breakdown_type": "event", "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results_breakdown = ClickhouseFunnelTrends(filter_breakdown, self.team, ClickhouseFunnel)._exec_query() self.assertEqual(results_breakdown, results)
def test_window_size_one_day(self): filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-05-01 00:00:00", "date_to": "2021-05-07 00:00:00", "funnel_window_days": 1, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results = ClickhouseFunnelTrends(filter, self.team).perform_query() saturday = results[0] # 5/1 self.assertEqual(1, saturday["completed_funnels"]) self.assertEqual(6, saturday["total"]) self.assertEqual(16.67, saturday["percent_complete"]) self.assertEqual(True, saturday["is_complete"]) self.assertEqual(1, len(saturday["cohort"])) sunday = results[1] # 5/2 self.assertEqual(0, sunday["completed_funnels"]) self.assertEqual(6, sunday["total"]) self.assertEqual(0.00, sunday["percent_complete"]) self.assertEqual(True, sunday["is_complete"]) self.assertEqual(0, len(sunday["cohort"])) monday = results[2] # 5/3 self.assertEqual(0, monday["completed_funnels"]) self.assertEqual(6, monday["total"]) self.assertEqual(0.00, monday["percent_complete"]) self.assertEqual(True, monday["is_complete"]) self.assertEqual(0, len(monday["cohort"])) tuesday = results[3] # 5/4 self.assertEqual(0, tuesday["completed_funnels"]) self.assertEqual(6, tuesday["total"]) self.assertEqual(0.00, tuesday["percent_complete"]) self.assertEqual(True, tuesday["is_complete"]) self.assertEqual(2, len(tuesday["cohort"])) wednesday = results[4] # 5/5 self.assertEqual(0, wednesday["completed_funnels"]) self.assertEqual(6, wednesday["total"]) self.assertEqual(0.00, wednesday["percent_complete"]) self.assertEqual(True, wednesday["is_complete"]) self.assertEqual(2, len(wednesday["cohort"])) thursday = results[5] # 5/6 self.assertEqual(0, thursday["completed_funnels"]) self.assertEqual(6, thursday["total"]) self.assertEqual(0.00, thursday["percent_complete"]) self.assertEqual(True, thursday["is_complete"]) self.assertEqual(1, len(thursday["cohort"])) friday = results[6] # 5/7 self.assertEqual(0, friday["completed_funnels"]) self.assertEqual(6, friday["total"]) self.assertEqual(0.00, friday["percent_complete"]) self.assertEqual(True, friday["is_complete"]) self.assertEqual(0, len(friday["cohort"]))
def test_one_person_in_multiple_periods_and_windows_in_strict_funnel(self): _create_person(distinct_ids=["user_one"], team=self.team) _create_person(distinct_ids=["user_two"], team=self.team) # 1st user's 1st complete run _create_event(event="step one", distinct_id="user_one", team=self.team, timestamp="2021-05-01 01:00:00") _create_event(event="step two", distinct_id="user_one", team=self.team, timestamp="2021-05-01 02:00:00") _create_event(event="step three", distinct_id="user_one", team=self.team, timestamp="2021-05-01 03:00:00") # 1st user's incomplete run _create_event(event="step one", distinct_id="user_one", team=self.team, timestamp="2021-05-03 01:00:00") _create_event(event="step two", distinct_id="user_one", team=self.team, timestamp="2021-05-03 02:00:00") # broken because strict _create_event(event="blah", distinct_id="user_one", team=self.team, timestamp="2021-05-03 02:30:00") _create_event(event="step three", distinct_id="user_one", team=self.team, timestamp="2021-05-03 03:00:00") # 2nd user's incomplete run _create_event(event="step one", distinct_id="user_two", team=self.team, timestamp="2021-05-04 18:00:00") # broken because strict _create_event(event="blah", distinct_id="user_two", team=self.team, timestamp="2021-05-04 18:20:00") _create_event(event="step two", distinct_id="user_two", team=self.team, timestamp="2021-05-04 19:00:00") # 1st user's 2nd complete run _create_event(event="step one", distinct_id="user_one", team=self.team, timestamp="2021-05-04 11:00:00") _create_event(event="step two", distinct_id="user_one", team=self.team, timestamp="2021-05-04 12:00:00") _create_event(event="step three", distinct_id="user_one", team=self.team, timestamp="2021-05-04 13:00:00") filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-05-01 00:00:00", "date_to": "2021-05-04 23:59:59", "funnel_window_days": 1, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnelStrict)._exec_query() self.assertEqual(len(results), 4) day_1 = results[0] # 2021-05-01 self.assertEqual(day_1["reached_from_step_count"], 1) self.assertEqual(day_1["reached_to_step_count"], 1) self.assertEqual(day_1["conversion_rate"], 100) self.assertEqual(day_1["is_period_final"], True) day_2 = results[1] # 2021-05-02 self.assertEqual(day_2["reached_from_step_count"], 0) self.assertEqual(day_2["reached_to_step_count"], 0) self.assertEqual(day_2["conversion_rate"], 0) self.assertEqual(day_2["is_period_final"], True) day_3 = results[2] # 2021-05-03 self.assertEqual(day_3["reached_from_step_count"], 1) self.assertEqual(day_3["reached_to_step_count"], 0) self.assertEqual(day_3["conversion_rate"], 0) self.assertEqual(day_3["is_period_final"], True) day_4 = results[3] # 2021-05-04 self.assertEqual(day_4["reached_from_step_count"], 2) self.assertEqual(day_4["reached_to_step_count"], 1) self.assertEqual(day_4["conversion_rate"], 50) self.assertEqual(day_4["is_period_final"], True)
def test_one_person_in_multiple_periods_and_windows_in_unordered_funnel(self): _create_person(distinct_ids=["user_one"], team=self.team) _create_person(distinct_ids=["user_two"], team=self.team) # 1st user's 1st complete run _create_event(event="step one", distinct_id="user_one", team=self.team, timestamp="2021-05-01 01:00:00") _create_event(event="step three", distinct_id="user_one", team=self.team, timestamp="2021-05-01 02:00:00") _create_event(event="step two", distinct_id="user_one", team=self.team, timestamp="2021-05-01 03:00:00") # 1st user's incomplete run _create_event(event="step two", distinct_id="user_one", team=self.team, timestamp="2021-05-03 01:00:00") _create_event(event="step one", distinct_id="user_one", team=self.team, timestamp="2021-05-03 02:00:00") # 2nd user's incomplete run _create_event(event="step one", distinct_id="user_two", team=self.team, timestamp="2021-05-04 18:00:00") # 1st user's 2nd complete run _create_event(event="step three", distinct_id="user_one", team=self.team, timestamp="2021-05-04 11:00:00") _create_event(event="step one", distinct_id="user_one", team=self.team, timestamp="2021-05-04 12:00:00") _create_event(event="step two", distinct_id="user_one", team=self.team, timestamp="2021-05-04 13:00:00") filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-05-01 00:00:00", "date_to": "2021-05-04 23:59:59", "funnel_window_days": 1, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnelUnordered)._exec_query() self.assertEqual(len(results), 4) day_1 = results[0] # 2021-05-01 self.assertEqual(day_1["reached_from_step_count"], 1) self.assertEqual(day_1["reached_to_step_count"], 1) self.assertEqual(day_1["conversion_rate"], 100) self.assertEqual(day_1["is_period_final"], True) day_2 = results[1] # 2021-05-02 self.assertEqual(day_2["reached_from_step_count"], 0) self.assertEqual(day_2["reached_to_step_count"], 0) self.assertEqual(day_2["conversion_rate"], 0) self.assertEqual(day_2["is_period_final"], True) day_3 = results[2] # 2021-05-03 self.assertEqual(day_3["reached_from_step_count"], 1) self.assertEqual(day_3["reached_to_step_count"], 0) self.assertEqual(day_3["conversion_rate"], 0) self.assertEqual(day_3["is_period_final"], True) day_4 = results[3] # 2021-05-04 self.assertEqual(day_4["reached_from_step_count"], 2) self.assertEqual(day_4["reached_to_step_count"], 1) self.assertEqual(day_4["conversion_rate"], 50) self.assertEqual(day_4["is_period_final"], True) # 1 user who dropped off starting # 2021-05-04 funnel_trends_persons_existent_dropped_off_results, _ = ClickhouseFunnelTrendsPersons( Filter({**filter._data, "entrance_period_start": "2021-05-04 00:00:00", "drop_off": True}), self.team, ClickhouseFunnelUnordered, ).run() self.assertEqual( len(funnel_trends_persons_existent_dropped_off_results), 1, ) self.assertEqual( [person["distinct_ids"] for person in funnel_trends_persons_existent_dropped_off_results], [["user_two"]], ) # 1 user who converted starting # 2021-05-04 funnel_trends_persons_existent_dropped_off_results, _ = ClickhouseFunnelTrendsPersons( Filter({**filter._data, "entrance_period_start": "2021-05-04 00:00:00", "drop_off": False}), self.team, ClickhouseFunnelUnordered, ).run() self.assertEqual( len(funnel_trends_persons_existent_dropped_off_results), 1, ) self.assertEqual( [person["distinct_ids"] for person in funnel_trends_persons_existent_dropped_off_results], [["user_one"]], )
def test_window_size_one_day(self): self._create_sample_data() filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-05-01 00:00:00", "date_to": "2021-05-07 00:00:00", "funnel_window_days": 1, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) results = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnel)._exec_query() saturday = results[0] # 5/1 self.assertEqual(1, saturday["reached_to_step_count"]) self.assertEqual(3, saturday["reached_from_step_count"]) self.assertEqual(33.33, saturday["conversion_rate"]) self.assertEqual(True, saturday["is_period_final"]) sunday = results[1] # 5/2 self.assertEqual(0, sunday["reached_to_step_count"]) self.assertEqual(2, sunday["reached_from_step_count"]) self.assertEqual(0, sunday["conversion_rate"]) self.assertEqual(True, sunday["is_period_final"]) monday = results[2] # 5/3 self.assertEqual(0, monday["reached_to_step_count"]) self.assertEqual(0, monday["reached_from_step_count"]) self.assertEqual(0, monday["conversion_rate"]) self.assertEqual(True, monday["is_period_final"]) tuesday = results[3] # 5/4 self.assertEqual(0, tuesday["reached_to_step_count"]) self.assertEqual(0, tuesday["reached_from_step_count"]) self.assertEqual(0, tuesday["conversion_rate"]) self.assertEqual(True, tuesday["is_period_final"]) wednesday = results[4] # 5/5 self.assertEqual(0, wednesday["reached_to_step_count"]) self.assertEqual(0, wednesday["reached_from_step_count"]) self.assertEqual(0, wednesday["conversion_rate"]) self.assertEqual(True, wednesday["is_period_final"]) thursday = results[5] # 5/6 self.assertEqual(0, thursday["reached_to_step_count"]) self.assertEqual(1, thursday["reached_from_step_count"]) self.assertEqual(0, thursday["conversion_rate"]) self.assertEqual(True, thursday["is_period_final"]) friday = results[6] # 5/7 self.assertEqual(0, friday["reached_to_step_count"]) self.assertEqual(0, friday["reached_from_step_count"]) self.assertEqual(0, friday["conversion_rate"]) self.assertEqual(True, friday["is_period_final"])
def test_only_one_user_reached_one_step(self): _create_person(distinct_ids=["user a"], team=self.team) _create_event(event="step one", distinct_id="user a", team=self.team, timestamp="2021-06-07 19:00:00") filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-06-07 00:00:00", "date_to": "2021-06-13 23:59:59", "funnel_window_days": 7, "events": [ {"id": "step one", "order": 0}, {"id": "step two", "order": 1}, {"id": "step three", "order": 2}, ], } ) funnel_trends = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnel) results = funnel_trends._exec_query() self.assertEqual( results, [ { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 1, "timestamp": datetime(2021, 6, 7, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 8, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 9, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 10, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 11, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 12, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 13, 0, 0).replace(tzinfo=pytz.UTC), }, ], ) # 1 user who dropped off starting 2021-06-07 funnel_trends_persons_existent_dropped_off_results, _ = ClickhouseFunnelTrendsPersons( Filter({**filter._data, "entrance_period_start": "2021-06-07 00:00:00", "drop_off": True}), self.team, ClickhouseFunnel, ).run() self.assertEqual( len(funnel_trends_persons_existent_dropped_off_results), 1, ) self.assertEqual( [person["distinct_ids"] for person in funnel_trends_persons_existent_dropped_off_results], [["user a"]], ) # No users converted 2021-06-07 funnel_trends_persons_nonexistent_converted_results, _ = ClickhouseFunnelTrendsPersons( Filter({**filter._data, "entrance_period_start": "2021-06-07 00:00:00", "drop_off": False}), self.team, ClickhouseFunnel, ).run() self.assertEqual( len(funnel_trends_persons_nonexistent_converted_results), 0, ) # No users dropped off 2021-06-08 funnel_trends_persons_nonexistent_converted_results, _ = ClickhouseFunnelTrendsPersons( Filter({**filter._data, "entrance_period_start": "2021-06-08 00:00:00", "drop_off": True}), self.team, ClickhouseFunnel, ).run() self.assertEqual( len(funnel_trends_persons_nonexistent_converted_results), 0, )
def test_only_one_user_reached_one_step(self): _create_person(distinct_ids=["user a"], team=self.team) _create_event(event="step one", distinct_id="user a", team=self.team, timestamp="2021-06-07 19:00:00") filter = Filter( data={ "insight": INSIGHT_FUNNELS, "display": TRENDS_LINEAR, "interval": "day", "date_from": "2021-06-07 00:00:00", "date_to": "2021-06-13 23:59:59", "funnel_window_days": 7, "events": [ { "id": "step one", "order": 0 }, { "id": "step two", "order": 1 }, { "id": "step three", "order": 2 }, ], }) funnel_trends = ClickhouseFunnelTrends(filter, self.team, ClickhouseFunnel) results = funnel_trends.perform_query() self.assertEqual( results, [ { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 1, "timestamp": datetime(2021, 6, 7, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 8, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 9, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 10, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 11, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 12, 0, 0).replace(tzinfo=pytz.UTC), }, { "reached_to_step_count": 0, "is_period_final": True, "conversion_rate": 0, "reached_from_step_count": 0, "timestamp": datetime(2021, 6, 13, 0, 0).replace(tzinfo=pytz.UTC), }, ], )