0
0
mirror of https://github.com/PostHog/posthog.git synced 2024-11-24 09:14:46 +01:00
posthog/ee/api/test/test_action.py
2024-11-21 16:35:33 -05:00

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"])