kopia lustrzana https://github.com/jedie/PyInventory
Expand Playwright tests and add a Item with Tag and Image
rodzic
a4c328e6d4
commit
ef5164e14f
|
@ -1,6 +1,8 @@
|
||||||
import os
|
import os
|
||||||
|
import tempfile
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
|
||||||
# Avoid django.core.exceptions.SynchronousOnlyOperation:
|
# Avoid django.core.exceptions.SynchronousOnlyOperation:
|
||||||
|
@ -11,3 +13,14 @@ os.environ.setdefault('DJANGO_ALLOW_ASYNC_UNSAFE', '1')
|
||||||
def browser_context_args(browser_context_args):
|
def browser_context_args(browser_context_args):
|
||||||
browser_context_args['ignore_https_errors'] = True
|
browser_context_args['ignore_https_errors'] = True
|
||||||
return browser_context_args
|
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
|
||||||
|
|
|
@ -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
|
|
@ -18,6 +18,7 @@ from model_bakery import baker
|
||||||
from inventory import __version__
|
from inventory import __version__
|
||||||
from inventory.models import ItemImageModel, ItemModel
|
from inventory.models import ItemImageModel, ItemModel
|
||||||
from inventory.permissions import get_or_create_normal_user_group
|
from inventory.permissions import get_or_create_normal_user_group
|
||||||
|
from inventory_project.tests.fixtures import get_normal_user
|
||||||
|
|
||||||
|
|
||||||
ITEM_FORM_DEFAULTS = {
|
ITEM_FORM_DEFAULTS = {
|
||||||
|
@ -88,14 +89,7 @@ class AdminAnonymousTests(HtmlAssertionMixin, TestCase):
|
||||||
class AdminTestCase(HtmlAssertionMixin, TestCase):
|
class AdminTestCase(HtmlAssertionMixin, TestCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
cls.normaluser = baker.make(
|
cls.normaluser = get_normal_user()
|
||||||
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])
|
|
||||||
|
|
||||||
def test_normal_user_create_minimal_item(self):
|
def test_normal_user_create_minimal_item(self):
|
||||||
offset = datetime.timedelta(minutes=1)
|
offset = datetime.timedelta(minutes=1)
|
||||||
|
|
|
@ -6,6 +6,8 @@ from django.http import HttpRequest
|
||||||
from playwright.sync_api import Page, expect
|
from playwright.sync_api import Page, expect
|
||||||
|
|
||||||
from inventory import __version__
|
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
|
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/')
|
page.goto(f'{live_server}/admin/')
|
||||||
expect(page).to_have_url(f'{live_server}/admin/')
|
expect(page).to_have_url(f'{live_server}/admin/')
|
||||||
expect(page).to_have_title(f'Site administration | PyInventory v{__version__}')
|
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']
|
||||||
|
|
Ładowanie…
Reference in New Issue