from . import pages from django.core.management import call_command from django.test import TestCase from assets import models from django.test.utils import override_settings from django.urls import reverse from urllib.parse import urlparse from RIGS import models as rigsmodels from PyRIGS.tests.base import BaseTest, AutoLoginTest from assets import models from reversion import revisions as reversion import datetime class AssetListTests(AutoLoginTest): def setUp(self): super().setUp() sound = models.AssetCategory.objects.create(name="Sound") lighting = models.AssetCategory.objects.create(name="Lighting") working = models.AssetStatus.objects.create(name="Working", should_show=True) broken = models.AssetStatus.objects.create(name="Broken", should_show=False) models.Asset.objects.create(asset_id="1", description="Broken XLR", status=broken, category=sound, date_acquired=datetime.date(2020, 2, 1)) models.Asset.objects.create(asset_id="10", description="Working Mic", status=working, category=sound, date_acquired=datetime.date(2020, 2, 1)) models.Asset.objects.create(asset_id="2", description="A light", status=working, category=lighting, date_acquired=datetime.date(2020, 2, 1)) models.Asset.objects.create(asset_id="C1", description="The pearl", status=broken, category=lighting, date_acquired=datetime.date(2020, 2, 1)) self.page = pages.AssetListPage(self.driver, self.live_server_url).open() def test_default_statuses_applied(self): # Only the working stuff should be shown initially assetDescriptions = list(map(lambda x: x.description, self.page.assets)) self.assertEqual(2, len(assetDescriptions)) self.assertIn("A light", assetDescriptions) self.assertIn("Working Mic", assetDescriptions) def test_asset_order(self): # Only the working stuff should be shown initially self.page.status_selector.open() self.page.status_selector.set_option("Broken", True) self.page.status_selector.close() self.page.search() assetIDs = list(map(lambda x: x.id, self.page.assets)) self.assertEqual("1", assetIDs[0]) self.assertEqual("2", assetIDs[1]) self.assertEqual("10", assetIDs[2]) self.assertEqual("C1", assetIDs[3]) class TestSampleDataGenerator(TestCase): @override_settings(DEBUG=True) def test_generate_sample_data(self): # Run the management command and check there are no exceptions call_command('generateSampleAssetsData') # Check there are lots self.assertTrue(models.Asset.objects.all().count() > 50) self.assertTrue(models.Supplier.objects.all().count() > 50) def test_production_exception(self): from django.core.management.base import CommandError self.assertRaisesRegex(CommandError, ".*production", call_command, 'generateSampleAssetsData') class TestVersioningViews(TestCase): @classmethod def setUpTestData(cls): cls.profile = rigsmodels.Profile.objects.create(username="VersionTest", email="version@test.com", is_superuser=True, is_active=True, is_staff=True) working = models.AssetStatus.objects.create(name="Working", should_show=True) broken = models.AssetStatus.objects.create(name="Broken", should_show=False) general = models.AssetCategory.objects.create(name="General") lighting = models.AssetCategory.objects.create(name="Lighting") cls.assets = {} with reversion.create_revision(): reversion.set_user(cls.profile) cls.assets[1] = models.Asset.objects.create(asset_id="1991", description="Spaceflower", status=broken, category=lighting, date_acquired=datetime.date(1991, 12, 26)) with reversion.create_revision(): reversion.set_user(cls.profile) cls.assets[2] = models.Asset.objects.create(asset_id="0001", description="Virgil", status=working, category=lighting, date_acquired=datetime.date(2015, 1, 1)) with reversion.create_revision(): reversion.set_user(cls.profile) cls.assets[1].status = working cls.assets[1].save() def setUp(self): self.profile.set_password('testuser') self.profile.save() self.assertTrue(self.client.login(username=self.profile.username, password='testuser')) def test_history_loads_successfully(self): request_url = reverse('asset_history', kwargs={'pk': self.assets[1].asset_id}) response = self.client.get(request_url, follow=True) self.assertEqual(response.status_code, 200) def test_activity_table_loads_successfully(self): request_url = reverse('asset_activity_table') response = self.client.get(request_url, follow=True) self.assertEqual(response.status_code, 200) class TestEmbeddedViews(TestCase): @classmethod def setUpTestData(cls): cls.profile = rigsmodels.Profile.objects.create(username="EmbeddedViewsTest", email="embedded@test.com", is_superuser=True, is_active=True, is_staff=True) working = models.AssetStatus.objects.create(name="Working", should_show=True) lighting = models.AssetCategory.objects.create(name="Lighting") cls.assets = { 1: models.Asset.objects.create(asset_id="1991", description="Spaceflower", status=working, category=lighting, date_acquired=datetime.date(1991, 12, 26)) } def setUp(self): self.profile.set_password('testuser') self.profile.save() def testLoginRedirect(self): request_url = reverse('asset_embed', kwargs={'pk': self.assets[1].asset_id}) expected_url = "{0}?next={1}".format(reverse('login_embed'), request_url) # Request the page and check it redirects response = self.client.get(request_url, follow=True) self.assertRedirects(response, expected_url, status_code=302, target_status_code=200) # Now login self.assertTrue(self.client.login(username=self.profile.username, password='testuser')) # And check that it no longer redirects response = self.client.get(request_url, follow=True) self.assertEqual(len(response.redirect_chain), 0) def testLoginCookieWarning(self): login_url = reverse('login_embed') response = self.client.post(login_url, follow=True) self.assertContains(response, "Cookies do not seem to be enabled") def testXFrameHeaders(self): asset_url = reverse('asset_embed', kwargs={'pk': self.assets[1].asset_id}) login_url = reverse('login_embed') self.assertTrue(self.client.login(username=self.profile.username, password='testuser')) response = self.client.get(asset_url, follow=True) with self.assertRaises(KeyError): response._headers["X-Frame-Options"] response = self.client.get(login_url, follow=True) with self.assertRaises(KeyError): response._headers["X-Frame-Options"] def testOEmbed(self): asset_url = reverse('asset_detail', kwargs={'pk': self.assets[1].asset_id}) asset_embed_url = reverse('asset_embed', kwargs={'pk': self.assets[1].asset_id}) oembed_url = reverse('asset_oembed', kwargs={'pk': self.assets[1].asset_id}) alt_oembed_url = reverse('asset_oembed', kwargs={'pk': 999}) alt_asset_embed_url = reverse('asset_embed', kwargs={'pk': 999}) # Test the meta tag is in place response = self.client.get(asset_url, follow=True, HTTP_HOST='example.com') self.assertContains(response, '