PyInventory/inventory_project/tests/test_playwright_admin.py

158 wiersze
7.1 KiB
Python

from bx_django_utils.test_utils.playwright import PlaywrightTestCase
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from django.http import HttpRequest
from django.test import override_settings
from override_storage import locmem_stats_override_storage
from playwright.sync_api import BrowserContext, expect
from inventory import __version__
from inventory.models import ItemImageModel, ItemLinkModel, ItemModel
from inventory_project.tests.fixtures import TempImageFile, get_normal_user
from inventory_project.tests.playwright_utils import login
@override_settings(SECURE_SSL_REDIRECT=False)
class PlaywrightInventoryTestCase(PlaywrightTestCase):
def test_root_page(self):
context: BrowserContext = self.browser.new_context(
ignore_https_errors=True,
locale='en_US',
timezone_id='Europe/Berlin',
)
with context.new_page() as page:
page.goto(self.live_server_url)
expect(page).to_have_url(f'{self.live_server_url}/admin/login/?next=/admin/')
expect(page).to_have_title(f'Log in | PyInventory v{__version__}')
def test_login(self):
username = 'a-user'
password = 'ThisIsNotAPassword!'
superuser = User.objects.create_superuser(username=username, password=password)
superuser.full_clean()
user = authenticate(request=HttpRequest(), username=username, password=password)
assert isinstance(user, User)
context: BrowserContext = self.browser.new_context(
ignore_https_errors=True,
locale='en_US',
timezone_id='Europe/Berlin',
)
with context.new_page() as page:
page.goto(self.live_server_url)
expect(page).to_have_url(f'{self.live_server_url}/admin/login/?next=/admin/')
expect(page).to_have_title(f'Log in | PyInventory v{__version__}')
page.type('#id_username', username)
page.type('#id_password', password)
page.locator('text=Log in').click()
expect(page).to_have_url(f'{self.live_server_url}/admin/')
expect(page).to_have_title(f'Site administration | PyInventory v{__version__}')
def test_admin(self):
superuser = User.objects.create_superuser(username='foo', password='ThisIsNotAPassword!')
superuser.full_clean()
context: BrowserContext = self.browser.new_context(
ignore_https_errors=True,
locale='en_US',
timezone_id='Europe/Berlin',
)
with context.new_page() as page:
login(page, self.client, url=self.live_server_url, user=superuser)
page.goto(f'{self.live_server_url}/admin/')
expect(page).to_have_url(f'{self.live_server_url}/admin/')
expect(page).to_have_title(f'Site administration | PyInventory v{__version__}')
def test_normal_user_create_item(self):
normal_user = get_normal_user()
context: BrowserContext = self.browser.new_context(
ignore_https_errors=True,
locale='en_US',
timezone_id='Europe/Berlin',
)
with context.new_page() as page, TempImageFile(
format='png', size=(1, 1)
) as png_image, locmem_stats_override_storage() as storage_stats:
login(page, self.client, url=self.live_server_url, user=normal_user)
page.goto(f'{self.live_server_url}/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.get_by_role('link', name='Add another Link').click()
page.locator('#id_itemlinkmodel_set-0-url').click()
page.locator('#id_itemlinkmodel_set-0-url').fill('http://test.tld/foo/bar')
page.locator('#id_itemlinkmodel_set-0-name').click()
page.locator('#id_itemlinkmodel_set-0-name').fill('The First Link')
page.locator('#id_itemlinkmodel_set-0-tags').click()
page.locator('#id_itemlinkmodel_set-0-tags').fill('a-link-tag')
page.locator('#id_itemlinkmodel_set-0-tags').press('Tab')
# Add Image
page.get_by_role('link', name='Add another Image').click()
page.locator('#id_itemimagemodel_set-0-image').click()
page.locator('#id_itemimagemodel_set-0-image').set_input_files(png_image.name)
page.locator('#id_itemimagemodel_set-0-name').click()
page.locator('#id_itemimagemodel_set-0-name').fill('The Image Name')
page.locator('#id_itemimagemodel_set-0-tags').click()
page.locator('#id_itemimagemodel_set-0-tags').fill('a-image-tag')
page.locator('#id_itemimagemodel_set-0-tags').press('Tab')
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'{self.live_server_url}/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']
# The "png_image" file should be stored:
self.assertEqual(storage_stats.save_cnt, 1)