mirror of
https://github.com/PostHog/posthog.git
synced 2024-11-25 11:17:50 +01:00
102 lines
3.9 KiB
Python
102 lines
3.9 KiB
Python
from typing import cast
|
|
|
|
import pytest
|
|
from django.utils import timezone
|
|
from rest_framework import status
|
|
|
|
from posthog.cloud_utils import is_cloud
|
|
from posthog.models import Action, Tag
|
|
from posthog.test.base import APIBaseTest
|
|
|
|
# Testing enterprise properties of actions here (i.e., tagging).
|
|
|
|
|
|
@pytest.mark.ee
|
|
class TestActionApi(APIBaseTest):
|
|
def test_create_action_update_delete_tags(self):
|
|
from ee.models.license import License, LicenseManager
|
|
|
|
super(LicenseManager, cast(LicenseManager, License.objects)).create(
|
|
key="key_123",
|
|
plan="enterprise",
|
|
valid_until=timezone.datetime(2038, 1, 19, 3, 14, 7),
|
|
)
|
|
|
|
response = self.client.post(f"/api/projects/{self.team.id}/actions/", data={"name": "user signed up"})
|
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
|
self.assertEqual(response.json()["tags"], [])
|
|
|
|
response = self.client.patch(
|
|
f"/api/projects/{self.team.id}/actions/{response.json()['id']}",
|
|
data={"name": "user signed up", "tags": ["hello", "random"]},
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(set(response.json()["tags"]), {"hello", "random"})
|
|
|
|
response = self.client.patch(
|
|
f"/api/projects/{self.team.id}/actions/{response.json()['id']}",
|
|
data={"name": "user signed up", "tags": []},
|
|
)
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(response.json()["tags"], [])
|
|
|
|
def test_create_action_with_tags(self):
|
|
from ee.models.license import License, LicenseManager
|
|
|
|
super(LicenseManager, cast(LicenseManager, License.objects)).create(
|
|
key="key_123",
|
|
plan="enterprise",
|
|
valid_until=timezone.datetime(2038, 1, 19, 3, 14, 7),
|
|
)
|
|
|
|
response = self.client.post(
|
|
f"/api/projects/{self.team.id}/actions/",
|
|
data={
|
|
"name": "user signed up",
|
|
"tags": ["nightly", "is", "a", "good", "girl"],
|
|
},
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
|
self.assertEqual(set(response.json()["tags"]), {"nightly", "is", "a", "good", "girl"})
|
|
|
|
def test_actions_does_not_nplus1(self):
|
|
from ee.models.license import License, LicenseManager
|
|
|
|
super(LicenseManager, cast(LicenseManager, License.objects)).create(
|
|
key="key_123",
|
|
plan="enterprise",
|
|
valid_until=timezone.datetime(2038, 1, 19, 3, 14, 7),
|
|
)
|
|
|
|
# Ensure the cloud check is cached to not affect the number of queries
|
|
assert not is_cloud()
|
|
|
|
tag = Tag.objects.create(name="tag", team=self.team)
|
|
for i in range(20):
|
|
action = Action.objects.create(team=self.team, name=f"action_{i}")
|
|
action.tagged_items.create(tag=tag)
|
|
|
|
# django_session + user + team + look up if rate limit is enabled (cached after first lookup)
|
|
# + organizationmembership + organization + action + taggeditem
|
|
with self.assertNumQueries(8):
|
|
response = self.client.get(f"/api/projects/{self.team.id}/actions")
|
|
self.assertEqual(response.json()["results"][0]["tags"][0], "tag")
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(len(response.json()["results"]), 20)
|
|
|
|
def test_actions_no_duplicate_tags(self):
|
|
from ee.models.license import License, LicenseManager
|
|
|
|
super(LicenseManager, cast(LicenseManager, License.objects)).create(
|
|
key="key_123",
|
|
plan="enterprise",
|
|
valid_until=timezone.datetime(2038, 1, 19, 3, 14, 7),
|
|
)
|
|
response = self.client.post(
|
|
f"/api/projects/{self.team.id}/actions/",
|
|
data={"name": "user signed up", "tags": ["a", "b", "a"]},
|
|
)
|
|
|
|
self.assertListEqual(sorted(response.json()["tags"]), ["a", "b"])
|