Add integration tests (#20)

* Adding integration tests with inlines

* Adding more tests

* FIx make file

* Setup CI build matrix to work with integration tests

* Try again

* Fix workflow synctax

* Clean up workflow

* Format and some lint stuff

* Try codecov

* yml

* More Testing

* Minor lint things

* Update

* Try again for codecov

* Updates

* Try?

* Ignore quotes

* Exclude test project

* try this?

* checkout required

* Rename

* clean up configs

* Fix

* Allow to fail

* ignores

* FInish the integration tests for cache

* Fix workflow yml

* fix

* Try up again

* TRy again

* Fix

* Fix

* Fix tests

Co-authored-by: Thu Trang Pham <thu@joinmodernhealth.com>
This commit is contained in:
Thu Trang Pham
2021-03-05 19:54:01 -08:00
committed by GitHub
parent 4f50c63f7b
commit ad7409b567
31 changed files with 677 additions and 185 deletions
@@ -3,5 +3,6 @@ from admin_confirm.tests.helpers import AdminConfirmIntegrationTestCase
class SmokeTest(AdminConfirmIntegrationTestCase):
def test_load_admin(self):
self.selenium.get(self.live_server_url+'/admin/')
self.assertIn('Django', self.selenium.title)
self.selenium.get(self.live_server_url + "/admin/")
self.assertIn("Django", self.selenium.title)
self.assertIn("Market", self.selenium.page_source)
@@ -0,0 +1,213 @@
"""
Tests confirmation of add/change
on ModelAdmin that utilize caches
"""
import os
import pytest
import pkg_resources
from importlib import reload
from tests.factories import ShopFactory
from tests.market.models import GeneralManager, Item, ShoppingMall, Town
from admin_confirm.tests.helpers import AdminConfirmIntegrationTestCase
from tests.market.admin import shoppingmall_admin
from admin_confirm.constants import CONFIRM_CHANGE
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.remote.file_detector import LocalFileDetector
from django.core.files.uploadedfile import SimpleUploadedFile
from tempfile import NamedTemporaryFile
class ConfirmWithInlinesTests(AdminConfirmIntegrationTestCase):
def setUp(self):
self.selenium.file_detector = LocalFileDetector()
super().setUp()
def tearDown(self):
reload(shoppingmall_admin)
super().tearDown()
def test_models_without_files_should_not_have_confirmation_received(self):
mall = ShoppingMall.objects.create(name="mall")
self.selenium.get(
self.live_server_url + f"/admin/market/shoppingmall/{mall.id}/change/"
)
# Should ask for confirmation of change
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Change name
name = self.selenium.find_element_by_name("name")
name.send_keys("New Name")
self.selenium.find_element_by_name("_continue").click()
# Should have hidden form containing the updated name
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
name = hidden_form.find_element_by_name("name")
self.assertIn("New Name", name.get_attribute("value"))
with self.assertRaises(NoSuchElementException):
self.selenium.find_element_by_name("_confirmation_received")
self.selenium.find_element_by_name("_continue").click()
# Should persist change
mall.refresh_from_db()
self.assertIn("New Name", mall.name)
def test_models_with_files_should_have_confirmation_received(self):
item = Item.objects.create(name="item", price=1)
self.selenium.get(
self.live_server_url + f"/admin/market/item/{item.id}/change/"
)
# Should ask for confirmation of change
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Change price
price = self.selenium.find_element_by_name("price")
price.send_keys(2)
self.selenium.find_element_by_name("_continue").click()
# Should have hidden form containing the updated price
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
price = hidden_form.find_element_by_name("price")
self.assertEqual("21.00", price.get_attribute("value"))
self.selenium.find_element_by_name("_confirmation_received")
self.selenium.find_element_by_name("_continue").click()
item.refresh_from_db()
def test_should_save_file_additions(self):
selenium_version = pkg_resources.get_distribution("selenium").parsed_version
if selenium_version.major < 4:
pytest.skip(
"Known issue `https://github.com/SeleniumHQ/selenium/issues/8762` with this selenium version."
)
item = Item.objects.create(
name="item", price=1, currency=Item.VALID_CURRENCIES[0][0]
)
self.selenium.get(
self.live_server_url + f"/admin/market/item/{item.id}/change/"
)
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Make a change to trigger confirmation page
price = self.selenium.find_element_by_name("price")
price.send_keys(2)
# Upload a new file
self.selenium.find_element_by_id("id_file").send_keys(
os.getcwd() + "/screenshot.png"
)
self.selenium.find_element_by_name("_continue").click()
# Should have hidden form containing the updated price
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
price = hidden_form.find_element_by_name("price")
self.assertEqual("21.00", price.get_attribute("value"))
self.selenium.find_element_by_name("_confirmation_received")
self.selenium.find_element_by_name("_continue").click()
item.refresh_from_db()
self.assertEqual(21, int(item.price))
self.assertIn("screenshot.png", item.file.name)
def test_should_save_file_changes(self):
selenium_version = pkg_resources.get_distribution("selenium").parsed_version
if selenium_version.major < 4:
pytest.skip(
"Known issue `https://github.com/SeleniumHQ/selenium/issues/8762` with this selenium version."
)
file = SimpleUploadedFile(
name="old_file.jpg",
content=open("screenshot.png", "rb").read(),
content_type="image/jpeg",
)
item = Item.objects.create(
name="item", price=1, currency=Item.VALID_CURRENCIES[0][0], file=file
)
self.selenium.get(
self.live_server_url + f"/admin/market/item/{item.id}/change/"
)
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Make a change to trigger confirmation page
price = self.selenium.find_element_by_name("price")
price.send_keys(2)
# Upload a new file
self.selenium.find_element_by_id("id_file").send_keys(
os.getcwd() + "/screenshot.png"
)
self.selenium.find_element_by_name("_continue").click()
# Should have hidden form containing the updated price
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
price = hidden_form.find_element_by_name("price")
self.assertEqual("21.00", price.get_attribute("value"))
self.selenium.find_element_by_name("_confirmation_received")
self.selenium.find_element_by_name("_continue").click()
item.refresh_from_db()
self.assertEqual(21, int(item.price))
self.assertIn("screenshot.png", item.file.name)
def test_should_remove_file_if_clear_selected(self):
file = SimpleUploadedFile(
name="old_file.jpg",
content=open("screenshot.png", "rb").read(),
content_type="image/jpeg",
)
item = Item.objects.create(
name="item", price=1, currency=Item.VALID_CURRENCIES[0][0], file=file
)
self.selenium.get(
self.live_server_url + f"/admin/market/item/{item.id}/change/"
)
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Make a change to trigger confirmation page
price = self.selenium.find_element_by_name("price")
price.send_keys(2)
# Choose to clear the existing file
self.selenium.find_element_by_id("file-clear_id").click()
self.assertTrue(
self.selenium.find_element_by_xpath(
".//*[@id='file-clear_id']"
).get_attribute("checked")
)
self.selenium.find_element_by_name("_continue").click()
# Should have hidden form containing the updated price
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
price = hidden_form.find_element_by_name("price")
self.assertEqual("21.00", price.get_attribute("value"))
self.selenium.find_element_by_name("_confirmation_received")
self.selenium.find_element_by_name("_continue").click()
item.refresh_from_db()
self.assertEqual(21, int(item.price))
# Should have cleared `file` since clear was selected
self.assertFalse(item.file)
@@ -0,0 +1,202 @@
"""
Tests confirmation of add/change
on ModelAdmin that includes inlines
Does not test confirmation of inline changes
"""
import pytest
import pkg_resources
from importlib import reload
from tests.factories import ShopFactory
from tests.market.models import GeneralManager, ShoppingMall, Town
from admin_confirm.tests.helpers import AdminConfirmIntegrationTestCase
from tests.market.admin import shoppingmall_admin
from admin_confirm.constants import CONFIRM_CHANGE
from selenium.webdriver.support.ui import Select
class ConfirmWithInlinesTests(AdminConfirmIntegrationTestCase):
def setUp(self):
self.admin = shoppingmall_admin.ShoppingMallAdmin
self.admin.inlines = [shoppingmall_admin.ShopInline]
super().setUp()
def tearDown(self):
reload(shoppingmall_admin)
super().tearDown()
def test_should_have_hidden_form(self):
mall = ShoppingMall.objects.create(name="mall")
self.selenium.get(
self.live_server_url + f"/admin/market/shoppingmall/{mall.id}/change/"
)
# Should ask for confirmation of change
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Change name
name = self.selenium.find_element_by_name("name")
name.send_keys("New Name")
self.selenium.find_element_by_name("_continue").click()
# Should have hidden form containing the updated name
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
name = hidden_form.find_element_by_name("name")
self.assertIn("New Name", name.get_attribute("value"))
self.selenium.find_element_by_name("_continue").click()
# Should persist change
mall.refresh_from_db()
self.assertIn("New Name", mall.name)
def test_should_have_hidden_formsets(self):
# Not having formsets would cause a `ManagementForm tampered with` issue
gm = GeneralManager.objects.create(name="gm")
shops = [ShopFactory(name=i) for i in range(3)]
town = Town.objects.create(name="town")
mall = ShoppingMall.objects.create(name="mall", general_manager=gm, town=town)
mall.shops.set(shops)
self.selenium.get(
self.live_server_url + f"/admin/market/shoppingmall/{mall.id}/change/"
)
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Make a change to trigger confirmation page
name = self.selenium.find_element_by_name("name")
name.send_keys("New Name")
self.selenium.find_element_by_name("_continue").click()
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
hidden_form.find_element_by_name("ShoppingMall_shops-TOTAL_FORMS")
self.selenium.find_element_by_name("_continue").click()
mall.refresh_from_db()
self.assertIn("New Name", mall.name)
def test_should_have_saved_inline_changes(self):
gm = GeneralManager.objects.create(name="gm")
town = Town.objects.create(name="town")
mall = ShoppingMall.objects.create(name="mall", general_manager=gm, town=town)
shops = [ShopFactory(name=i) for i in range(3)]
self.selenium.get(
self.live_server_url + f"/admin/market/shoppingmall/{mall.id}/change/"
)
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Make a change to trigger confirmation page
name = self.selenium.find_element_by_name("name")
name.send_keys("New Name")
# Change shops via inline form
select_shop = Select(
self.selenium.find_element_by_name("ShoppingMall_shops-0-shop")
)
select_shop.select_by_value(str(shops[2].id))
self.selenium.find_element_by_name("_continue").click()
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
hidden_form.find_element_by_name("ShoppingMall_shops-TOTAL_FORMS")
self.selenium.find_element_by_name("_continue").click()
mall.refresh_from_db()
self.assertIn("New Name", mall.name)
self.assertIn(shops[2], mall.shops.all())
def test_should_respect_get_inlines(self):
# New in Django 3.0
django_version = pkg_resources.get_distribution("Django").parsed_version
if django_version.major < 3:
pytest.skip(
"get_inlines() introducted in Django 3.0, and is not in this version"
)
shoppingmall_admin.ShoppingMallAdmin.inlines = []
shoppingmall_admin.ShoppingMallAdmin.get_inlines = (
lambda self, request, obj=None: [shoppingmall_admin.ShopInline]
)
gm = GeneralManager.objects.create(name="gm")
town = Town.objects.create(name="town")
mall = ShoppingMall.objects.create(name="mall", general_manager=gm, town=town)
shops = [ShopFactory(name=i) for i in range(3)]
self.selenium.get(
self.live_server_url + f"/admin/market/shoppingmall/{mall.id}/change/"
)
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Make a change to trigger confirmation page
name = self.selenium.find_element_by_name("name")
name.send_keys("New Name")
# Change shops via inline form
select_shop = Select(
self.selenium.find_element_by_name("ShoppingMall_shops-0-shop")
)
select_shop.select_by_value(str(shops[2].id))
self.selenium.find_element_by_name("_continue").click()
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
hidden_form.find_element_by_name("ShoppingMall_shops-TOTAL_FORMS")
self.selenium.find_element_by_name("_continue").click()
mall.refresh_from_db()
self.assertIn("New Name", mall.name)
self.assertIn(shops[2], mall.shops.all())
def test_should_respect_get_inline_instances(self):
shoppingmall_admin.ShoppingMallAdmin.inlines = []
shoppingmall_admin.ShoppingMallAdmin.get_inline_instances = (
lambda self, request, obj=None: shoppingmall_admin.ShopInline(
self.model, self.admin_site
)
)
gm = GeneralManager.objects.create(name="gm")
town = Town.objects.create(name="town")
mall = ShoppingMall.objects.create(name="mall", general_manager=gm, town=town)
shops = [ShopFactory(name=i) for i in range(3)]
self.selenium.get(
self.live_server_url + f"/admin/market/shoppingmall/{mall.id}/change/"
)
self.assertIn(CONFIRM_CHANGE, self.selenium.page_source)
# Make a change to trigger confirmation page
name = self.selenium.find_element_by_name("name")
name.send_keys("New Name")
# Change shops via inline form
select_shop = Select(
self.selenium.find_element_by_name("ShoppingMall_shops-0-shop")
)
select_shop.select_by_value(str(shops[2].id))
self.selenium.find_element_by_name("_continue").click()
self.assertIn("Confirm", self.selenium.page_source)
hidden_form = self.selenium.find_element_by_id("hidden-form")
hidden_form.find_element_by_name("ShoppingMall_shops-TOTAL_FORMS")
self.selenium.find_element_by_name("_continue").click()
mall.refresh_from_db()
self.assertIn("New Name", mall.name)
self.assertIn(shops[2], mall.shops.all())