File size: 5,036 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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
defmodule Plausible.AuthTest do
  use Plausible.DataCase, async: true
  alias Plausible.Auth

  test "enterprise_configured?/1 returns whether the user has an enterprise plan" do
    user_without_plan = new_user()
    user_with_plan = new_user() |> subscribe_to_enterprise_plan()

    user_with_plan_no_subscription =
      new_user() |> subscribe_to_enterprise_plan(subscription?: false)

    assert Plausible.Teams.Billing.enterprise_configured?(team_of(user_with_plan))

    assert Plausible.Teams.Billing.enterprise_configured?(team_of(user_with_plan_no_subscription))

    refute Plausible.Teams.Billing.enterprise_configured?(team_of(user_without_plan))
    refute Plausible.Teams.Billing.enterprise_configured?(nil)
  end

  describe "create_stats_api_key/3" do
    test "creates a new api key" do
      user = new_user(trial_expiry_date: Date.utc_today())
      team = team_of(user)
      key = Ecto.UUID.generate()

      assert {:ok, %Auth.ApiKey{} = api_key} =
               Auth.create_stats_api_key(user, team, "my new key", key)

      assert api_key.team_id == team.id
      assert api_key.user_id == user.id
    end

    test "errors when key already exists" do
      u1 = new_user(trial_expiry_date: Date.utc_today())
      t1 = team_of(u1)
      u2 = new_user(trial_expiry_date: Date.utc_today())
      t2 = team_of(u2)
      key = Ecto.UUID.generate()
      assert {:ok, %Auth.ApiKey{}} = Auth.create_stats_api_key(u1, t1, "my new key", key)
      assert {:error, changeset} = Auth.create_stats_api_key(u2, t2, "my other key", key)

      assert changeset.errors[:key] ==
               {"has already been taken",
                [constraint: :unique, constraint_name: "api_keys_key_hash_index"]}
    end

    @tag :ee_only
    test "returns error when team is on a growth plan" do
      user = new_user() |> subscribe_to_growth_plan()
      team = team_of(user)

      assert {:error, :upgrade_required} =
               Auth.create_stats_api_key(user, team, "my new key", Ecto.UUID.generate())
    end

    test "creates a key for user in a team with a bunsiness plan" do
      user = new_user() |> subscribe_to_business_plan()
      team = team_of(user)
      another_site = new_site()
      add_member(another_site.team, user: user, role: :owner)

      assert {:ok, %Auth.ApiKey{}} =
               Auth.create_stats_api_key(user, team, "my new key", Ecto.UUID.generate())
    end
  end

  describe "create_sites_api_key/3" do
    test "creates a new api key for user on enterprise plan with SitesAPI enabled" do
      user =
        new_user()
        |> subscribe_to_enterprise_plan(
          features: [Plausible.Billing.Feature.StatsAPI, Plausible.Billing.Feature.SitesAPI]
        )

      team = team_of(user)
      key = Ecto.UUID.generate()

      assert {:ok, %Auth.ApiKey{} = api_key} =
               Auth.create_sites_api_key(user, team, "my new key", key)

      assert api_key.team_id == team.id
      assert api_key.user_id == user.id
    end

    test "errors when key already exists" do
      u1 =
        new_user()
        |> subscribe_to_enterprise_plan(
          features: [Plausible.Billing.Feature.StatsAPI, Plausible.Billing.Feature.SitesAPI]
        )

      t1 = team_of(u1)

      u2 =
        new_user()
        |> subscribe_to_enterprise_plan(
          features: [Plausible.Billing.Feature.StatsAPI, Plausible.Billing.Feature.SitesAPI]
        )

      t2 = team_of(u2)
      key = Ecto.UUID.generate()
      assert {:ok, %Auth.ApiKey{}} = Auth.create_sites_api_key(u1, t1, "my new key", key)
      assert {:error, changeset} = Auth.create_sites_api_key(u2, t2, "my other key", key)

      assert changeset.errors[:key] ==
               {"has already been taken",
                [constraint: :unique, constraint_name: "api_keys_key_hash_index"]}
    end

    @tag :ee_only
    test "returns error when team is on a business plan" do
      user = new_user() |> subscribe_to_business_plan()
      team = team_of(user)

      assert {:error, :upgrade_required} =
               Auth.create_sites_api_key(user, team, "my new key", Ecto.UUID.generate())
    end
  end

  describe "delete_api_key/2" do
    test "deletes the record" do
      user = new_user(trial_expiry_date: Date.utc_today())
      team = team_of(user)

      assert {:ok, api_key} =
               Auth.create_stats_api_key(user, team, "my new key", Ecto.UUID.generate())

      assert :ok = Auth.delete_api_key(user, api_key.id)
      refute Plausible.Repo.reload(api_key)
    end

    test "returns error when api key does not exist or does not belong to user" do
      me = new_user(trial_expiry_date: Date.utc_today())

      other_user = new_user(trial_expiry_date: Date.utc_today())
      other_team = team_of(other_user)

      {:ok, other_api_key} =
        Auth.create_stats_api_key(other_user, other_team, "my new key", Ecto.UUID.generate())

      assert {:error, :not_found} = Auth.delete_api_key(me, other_api_key.id)
      assert {:error, :not_found} = Auth.delete_api_key(me, -1)
    end
  end
end