Expand Playwright tests and add a Item with Tag and Image

pull/98/head
JensDiemer 2022-06-29 17:51:34 +02:00
rodzic a4c328e6d4
commit ef5164e14f
4 zmienionych plików z 121 dodań i 8 usunięć

Wyświetl plik

@ -1,6 +1,8 @@
import os
import tempfile
import pytest
from PIL import Image
# Avoid django.core.exceptions.SynchronousOnlyOperation:
@ -11,3 +13,14 @@ os.environ.setdefault('DJANGO_ALLOW_ASYNC_UNSAFE', '1')
def browser_context_args(browser_context_args):
browser_context_args['ignore_https_errors'] = True
return browser_context_args
@pytest.fixture(scope='function')
def png_image():
format = 'png'
with tempfile.NamedTemporaryFile(prefix='test_image', suffix=f'.{format}') as tmp:
image_size = (1, 1)
pil_image = Image.new('RGB', image_size)
pil_image.save(tmp, format=format)
tmp.seek(0)
yield tmp

Wyświetl plik

@ -0,0 +1,20 @@
from django.contrib.auth.models import User
from model_bakery import baker
from inventory.permissions import get_or_create_normal_user_group
def get_normal_user():
user = baker.make(
User,
id=1,
username='NormalUser',
is_staff=True,
is_active=True,
is_superuser=False,
)
assert user.user_permissions.count() == 0
group = get_or_create_normal_user_group()[0]
user.groups.set([group])
user.full_clean()
return user

Wyświetl plik

@ -18,6 +18,7 @@ from model_bakery import baker
from inventory import __version__
from inventory.models import ItemImageModel, ItemModel
from inventory.permissions import get_or_create_normal_user_group
from inventory_project.tests.fixtures import get_normal_user
ITEM_FORM_DEFAULTS = {
@ -88,14 +89,7 @@ class AdminAnonymousTests(HtmlAssertionMixin, TestCase):
class AdminTestCase(HtmlAssertionMixin, TestCase):
@classmethod
def setUpTestData(cls):
cls.normaluser = baker.make(
User,
id=1, username='NormalUser',
is_staff=True, is_active=True, is_superuser=False
)
assert cls.normaluser.user_permissions.count() == 0
group = get_or_create_normal_user_group()[0]
cls.normaluser.groups.set([group])
cls.normaluser = get_normal_user()
def test_normal_user_create_minimal_item(self):
offset = datetime.timedelta(minutes=1)

Wyświetl plik

@ -6,6 +6,8 @@ from django.http import HttpRequest
from playwright.sync_api import Page, expect
from inventory import __version__
from inventory.models import ItemImageModel, ItemLinkModel, ItemModel
from inventory_project.tests.fixtures import get_normal_user
from inventory_project.tests.playwright_utils import login
@ -50,3 +52,87 @@ def test_admin(live_server, client, page: Page):
page.goto(f'{live_server}/admin/')
expect(page).to_have_url(f'{live_server}/admin/')
expect(page).to_have_title(f'Site administration | PyInventory v{__version__}')
@pytest.mark.playwright
def test_normal_user_create_item(live_server, client, page: Page, png_image):
normal_user = get_normal_user()
login(page, client, url=live_server.url, user=normal_user)
page.goto(f'{live_server}/admin/inventory/itemmodel/add/')
expect(page).to_have_title(f'Add Item | PyInventory v{__version__}')
page.locator('label:has-text("Kind:")')
kind_field = page.locator('//input[@id="id_kind"]/..//input[@role="searchbox"]')
kind_field.click()
kind_field.fill('Mainboard')
kind_field.press('Enter')
page.locator('label:has-text("Producer:")')
producer_field = page.locator('//input[@id="id_producer"]/..//input[@role="searchbox"]')
producer_field.click()
producer_field.fill('Triple D Int.Ltd.')
producer_field.press('Enter')
page.locator('label:has-text("Name:")')
page.fill('//input[@id="id_name"]', 'TD-20 (8088)')
# Add a Link:
page.locator('text=Add another Link').click()
link_tags = page.locator(
'//input[@id="id_itemlinkmodel_set-0-tags"]/..//input[@role="searchbox"]'
)
link_tags.click()
link_tags.fill('a-link-tag')
link_tags.press('Enter')
page.locator('input[name="itemlinkmodel_set-0-name"]').fill('The First Link')
page.locator('input[name="itemlinkmodel_set-0-url"]').fill('http://test.tld/foo/bar')
# Add Image
page.locator("text=Add another Image").click()
choose_file = page.locator("input[name=\"itemimagemodel_set-0-image\"]")
choose_file.set_input_files(png_image.name)
page.fill("input[name=\"itemimagemodel_set-0-name\"]", "The Image Name")
image_tags = page.locator(
'//input[@id="id_itemimagemodel_set-0-tags"]/..//input[@role="searchbox"]'
)
image_tags.click()
image_tags.fill('a-image-tag')
image_tags.press("Enter")
assert ItemModel.objects.count() == 0
# Save the item:
page.locator('input:has-text("Save and continue editing")').click()
page.locator(
'text=The Tunes Item “A Test Tunes Item” was added successfully. You may edit it again'
)
page.locator('text="Triple D Int.Ltd." - TD-20 (8088)')
assert ItemModel.objects.count() == 1
item = ItemModel.objects.first()
assert item.verbose_name() == 'Mainboard - "Triple D Int.Ltd." - TD-20 (8088)'
# Save & continue?
expect(page).to_have_url(f'{live_server}/admin/inventory/itemmodel/{item.id}/change/')
# Check added image:
page.locator('text=The Image Name')
img = page.locator('//a[@class="image_file_input_preview"]/img')
img.scroll_into_view_if_needed()
img.is_visible()
assert img.evaluate('image => image.complete') is True
assert item.itemimagemodel_set.count() == 1
image: ItemImageModel = item.itemimagemodel_set.first()
assert str(image) == 'The Image Name'
assert image.user == normal_user
assert image.tags.get_tag_list() == ['a-image-tag']
# Check the added link:
page.locator('text=The First Link')
page.locator('text=Currently: http://test.tld/foo/bar')
links = list(item.itemlinkmodel_set.values_list('name', 'url'))
assert links == [('The First Link', 'http://test.tld/foo/bar')]
link: ItemLinkModel = item.itemlinkmodel_set.first()
assert link.tags.get_tag_list() == ['a-link-tag']