File size: 4,502 Bytes
c9c49ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
defmodule Plausible.Stats.QueryImportedTest do
  use Plausible.DataCase
  alias Plausible.Stats
  alias Plausible.Stats.{ParsedQueryParams, QueryBuilder, QueryInclude}

  @unsupported_query_warning Plausible.Stats.QueryResult.imports_warnings().unsupported_query
  @no_imported_scroll_depth_warning Plausible.Stats.QueryResult.no_imported_scroll_depth_warning()

  setup [:create_user, :create_site]

  describe "behavioral filters" do
    setup :create_site_import

    test "imports are skipped when has_done filter is used", %{
      site: site,
      site_import: site_import
    } do
      populate_stats(site, site_import.id, [
        build(:event, name: "pageview", user_id: 1, timestamp: ~N[2021-01-01 00:00:00]),
        build(:event, name: "pageview", user_id: 2, timestamp: ~N[2021-01-01 00:00:00]),
        build(:event, name: "Conversion", user_id: 3, timestamp: ~N[2021-01-01 00:00:00]),
        build(:imported_pages,
          page: "/blog",
          pageviews: 5,
          visitors: 3,
          date: ~D[2023-01-01]
        )
      ])

      assert {:ok, query} =
               QueryBuilder.build(site, %ParsedQueryParams{
                 metrics: [:visitors],
                 input_date_range: :all,
                 filters: [[:has_done, [:is, "event:name", ["pageview"]]]],
                 include: %QueryInclude{imports: true}
               })

      assert %Stats.QueryResult{results: results, meta: meta} = Stats.query(site, query)

      assert results == [%{dimensions: [], metrics: [2]}]
      refute meta[:imports_included]

      assert meta[:imports_warning] == @unsupported_query_warning
    end

    test "imports are skipped when has_not_done filter is used", %{
      site: site,
      site_import: site_import
    } do
      populate_stats(site, site_import.id, [
        build(:event, name: "pageview", user_id: 1, timestamp: ~N[2021-01-01 00:00:00]),
        build(:event, name: "pageview", user_id: 2, timestamp: ~N[2021-01-01 00:00:00]),
        build(:event, name: "Conversion", user_id: 3, timestamp: ~N[2021-01-01 00:00:00]),
        build(:imported_pages,
          page: "/blog",
          pageviews: 5,
          visitors: 3,
          date: ~D[2023-01-01]
        )
      ])

      assert {:ok, query} =
               QueryBuilder.build(site, %ParsedQueryParams{
                 metrics: [:visitors],
                 input_date_range: :all,
                 dimensions: ["event:goal"],
                 filters: [[:has_not_done, [:is, "event:name", ["pageview"]]]],
                 include: %QueryInclude{imports: true}
               })

      assert %Stats.QueryResult{results: results, meta: meta} = Stats.query(site, query)

      assert results == []
      refute meta[:imports_included]

      assert meta[:imports_warning] == @unsupported_query_warning
    end
  end

  describe "scroll depth metric warnings" do
    test "returns warning when import without scroll depth in comparison range", %{
      site: site
    } do
      site_import =
        insert(:site_import, site: site, start_date: ~D[2021-02-01], end_date: ~D[2021-02-28])

      populate_stats(site, site_import.id, [
        build(:pageview, user_id: 123, pathname: "/", timestamp: ~N[2021-02-01 00:00:00]),
        build(:engagement,
          user_id: 123,
          pathname: "/",
          timestamp: ~N[2021-02-01 00:01:00],
          scroll_depth: 70
        ),
        build(:imported_pages, page: "/", date: ~D[2021-02-01]),
        build(:imported_pages, page: "/", date: ~D[2021-02-28])
      ])

      assert {:ok, query} =
               QueryBuilder.build(site, %ParsedQueryParams{
                 metrics: [:visitors, :scroll_depth],
                 input_date_range: {:date_range, ~D[2022-01-01], ~D[2022-12-31]},
                 filters: [[:is, "event:page", ["/"]]],
                 include: %QueryInclude{imports: true, compare: :previous_period}
               })

      assert %Stats.QueryResult{results: results, meta: meta} = Stats.query(site, query)

      assert results == [
               %{
                 dimensions: [],
                 metrics: [0, nil],
                 comparison: %{
                   change: [-100, nil],
                   dimensions: [],
                   metrics: [3, 70]
                 }
               }
             ]

      assert meta[:imports_included] == true

      assert meta[:metric_warnings] == %{
               scroll_depth: @no_imported_scroll_depth_warning
             }
    end
  end
end