Ejemplo n.º 1
0
    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")
Ejemplo n.º 2
0
    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"]))
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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"]))
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
    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"]],
        )
Ejemplo n.º 11
0
    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"])
Ejemplo n.º 12
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._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,
        )
Ejemplo n.º 13
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),
                },
            ],
        )