Commit 7d05d67b by Tyler Hallada Committed by GitHub

AN-8634 Soapbox messages acceptance tests (#667)

* Add soapbox acceptance test w/ management commands

* Fix linting errors

* Add test case for inactive soapbox message

* Add unit test for create/delete message utils
parent 7ddb62c0
......@@ -47,12 +47,16 @@ endif
ifeq ("${ENABLE_COURSE_LIST_FILTERS}", "True")
./manage.py waffle_switch enable_course_filters on --create
endif
./manage.py create_acceptance_test_soapbox_messages
nosetests -v acceptance_tests -e NUM_PROCESSES=1 --exclude-dir=acceptance_tests/course_validation
./manage.py delete_acceptance_test_soapbox_messages
# local acceptance tests are typically run with by passing in environment variables on the commandline
# e.g. API_SERVER_URL="http://localhost:9001/api/v0" API_AUTH_TOKEN="edx" make accept_local
accept_local:
./manage.py create_acceptance_test_soapbox_messages
nosetests -v acceptance_tests --exclude-dir=acceptance_tests/course_validation
./manage.py delete_acceptance_test_soapbox_messages
a11y:
ifeq ("${DISPLAY_LEARNER_ANALYTICS}", "True")
......
......@@ -19,8 +19,8 @@ RESEARCH_URL = os.environ.get('RESEARCH_URL', 'http://example.com/')
SHOW_LANDING_RESEARCH = str2bool(os.environ.get('SHOW_LANDING_RESEARCH', True))
# Analytics data API settings
API_SERVER_URL = os.environ['API_SERVER_URL']
API_AUTH_TOKEN = os.environ['API_AUTH_TOKEN']
API_SERVER_URL = os.environ.get('API_SERVER_URL', 'http://localhost:9001')
API_AUTH_TOKEN = os.environ.get('API_AUTH_TOKEN', 'edx')
# Test configuration
ENABLE_AUTO_AUTH = str2bool(os.environ.get('ENABLE_AUTO_AUTH', False))
......@@ -81,3 +81,10 @@ DISPLAY_LEARNER_ANALYTICS = str2bool(os.environ.get('DISPLAY_LEARNER_ANALYTICS',
# Learner analytics
ENABLE_COURSE_LIST_FILTERS = str2bool(os.environ.get('ENABLE_COURSE_LIST_FILTERS', False))
# Soapbox Messages tests constants
SOAPBOX_GLOBAL_MESSAGE = 'Test global message'
SOAPBOX_SINGLE_PAGE_MESSAGE = 'Test single-page message'
SOAPBOX_INACTIVE_MESSAGE = 'Test inactive message'
SOAPBOX_SINGLE_PAGE_VIEW = 'insights_home'
SOAPBOX_SINGLE_PAGE_PATH = 'courses/'
import locale
import datetime
import locale
from unittest import skip
from bok_choy.promise import EmptyPromise
from analyticsclient.client import Client
from selenium.webdriver.common.keys import Keys
from acceptance_tests import (
API_SERVER_URL,
API_AUTH_TOKEN,
API_SERVER_URL,
COURSE_API_KEY,
COURSE_API_URL,
DASHBOARD_FEEDBACK_EMAIL,
......@@ -16,11 +15,16 @@ from acceptance_tests import (
DOC_BASE_URL,
ENABLE_AUTO_AUTH,
ENABLE_COURSE_API,
LMS_USERNAME,
LMS_PASSWORD,
LMS_USERNAME,
SOAPBOX_GLOBAL_MESSAGE,
SOAPBOX_INACTIVE_MESSAGE,
SOAPBOX_SINGLE_PAGE_MESSAGE,
SOAPBOX_SINGLE_PAGE_PATH,
SUPPORT_EMAIL,
)
from acceptance_tests.pages import LMSLoginPage
from analyticsclient.client import Client
from common.clients import CourseStructureApiClient
......@@ -270,8 +274,27 @@ class ContextSensitiveHelpMixin(object):
self.assertHrefEqual('#help', self.help_url)
class SoapboxMessagesMixin(object):
soapbox_selector = "div[class=announcement-container]"
def _test_soapbox_messages(self):
# make sure we have the correct soapbox messages displayed
element = self.page.q(css=self.soapbox_selector)
self.assertTrue(element.present)
self.assertTrue(SOAPBOX_GLOBAL_MESSAGE in element.text)
self.assertFalse(SOAPBOX_INACTIVE_MESSAGE in element.text)
if self.page.path == SOAPBOX_SINGLE_PAGE_PATH:
element = self.page.q(css=self.soapbox_selector)
self.assertTrue(SOAPBOX_SINGLE_PAGE_MESSAGE in element.text)
def test_page(self):
super(SoapboxMessagesMixin, self).test_page()
self._test_soapbox_messages()
class AnalyticsDashboardWebAppTestMixin(FooterMixin, PrimaryNavMixin, ContextSensitiveHelpMixin, AssertMixin,
LoginMixin):
LoginMixin, SoapboxMessagesMixin):
def test_page(self):
self.login()
self.page.visit()
......
from django.core.management.base import BaseCommand
from core.utils import create_fake_soapbox_messages
class Command(BaseCommand):
"""A command to create fake soapbox messages that the acceptance tests will check if displayed."""
help = 'Create fake soapbox messages for testing.'
def handle(self, *args, **options):
create_fake_soapbox_messages()
from django.core.management.base import BaseCommand
from core.utils import delete_fake_soapbox_messages
class Command(BaseCommand):
"""A command to delete the fake soapbox messages that the acceptance tests have completed checking."""
help = 'Delete fake soapbox messages for testing.'
def handle(self, *args, **options):
delete_fake_soapbox_messages()
......@@ -2,6 +2,7 @@ import uuid
from copy import deepcopy
from ddt import ddt
from mock import call, MagicMock, patch
from django.conf import settings
from django.contrib.auth import get_user_model
......@@ -10,13 +11,31 @@ from django.test import TestCase
from django.utils.translation import ugettext_lazy as _
from core.utils import (CourseStructureApiClient, delete_auto_auth_users, sanitize_cache_key, translate_dict_values,
remove_keys)
remove_keys, Message)
User = get_user_model()
class UtilsTests(TestCase):
def setUp(self):
self.acceptance_tests_mock = MagicMock()
self.acceptance_tests_mock.SOAPBOX_INACTIVE_MESSAGE = 'inactive'
self.acceptance_tests_mock.SOAPBOX_GLOBAL_MESSAGE = 'global'
self.acceptance_tests_mock.SOAPBOX_SINGLE_PAGE_MESSAGE = 'single-page'
self.acceptance_tests_mock.SOAPBOX_SINGLE_PAGE_VIEW = 'view'
modules = {
'acceptance_tests': self.acceptance_tests_mock,
}
self.module_patcher = patch.dict('sys.modules', modules)
self.module_patcher.start()
from core.utils import create_fake_soapbox_messages, delete_fake_soapbox_messages
self.create_messages = create_fake_soapbox_messages
self.delete_messages = delete_fake_soapbox_messages
def tearDown(self):
self.module_patcher.stop()
def test_delete_auto_auth_users(self):
# Create an auto-auth user
username = password = settings.AUTO_AUTH_USERNAME_PREFIX + uuid.uuid4().hex[0:20]
......@@ -98,6 +117,31 @@ class UtilsTests(TestCase):
self.assertDictEqual(remove_keys(dict_of_dicts, {'foo': {'bar': ('fizz',)}, '': ('flat',)}),
dict_of_dicts_no_fizz)
@patch.object(Message, 'objects')
def test_create_fake_soapbox_messages(self, objects_mock):
self.create_messages()
calls = [
call(message=self.acceptance_tests_mock.SOAPBOX_GLOBAL_MESSAGE, is_active=True, is_global=True),
call(message=self.acceptance_tests_mock.SOAPBOX_SINGLE_PAGE_MESSAGE, is_active=True, is_global=False,
url=self.acceptance_tests_mock.SOAPBOX_SINGLE_PAGE_VIEW),
call(message=self.acceptance_tests_mock.SOAPBOX_INACTIVE_MESSAGE, is_active=False, is_global=True),
]
objects_mock.get_or_create.assert_has_calls(calls)
@patch.object(Message, 'objects')
def test_delete_fake_soapbox_messages(self, objects_mock):
self.delete_messages()
calls = [
call(message=self.acceptance_tests_mock.SOAPBOX_GLOBAL_MESSAGE, is_active=True, is_global=True),
call().delete(),
call(message=self.acceptance_tests_mock.SOAPBOX_SINGLE_PAGE_MESSAGE, is_active=True, is_global=False,
url=self.acceptance_tests_mock.SOAPBOX_SINGLE_PAGE_VIEW),
call().delete(),
call(message=self.acceptance_tests_mock.SOAPBOX_INACTIVE_MESSAGE, is_active=False, is_global=True),
call().delete(),
]
objects_mock.get.assert_has_calls(calls)
@ddt
class CourseStructureApiClientTests(TestCase):
......
from hashlib import md5
from soapbox.models import Message
from waffle import switch_is_active
from django.conf import settings
......@@ -99,3 +100,22 @@ def remove_keys(d, keys):
if key in keys:
del d[key]
return d
def create_fake_soapbox_messages():
# Importing here so acceptance_tests/__init__.py doesn't start checking for env vars on every management command.
from acceptance_tests import (SOAPBOX_INACTIVE_MESSAGE, SOAPBOX_GLOBAL_MESSAGE, SOAPBOX_SINGLE_PAGE_MESSAGE,
SOAPBOX_SINGLE_PAGE_VIEW)
Message.objects.get_or_create(message=SOAPBOX_GLOBAL_MESSAGE, is_active=True, is_global=True)
Message.objects.get_or_create(message=SOAPBOX_SINGLE_PAGE_MESSAGE, is_active=True, is_global=False,
url=SOAPBOX_SINGLE_PAGE_VIEW)
Message.objects.get_or_create(message=SOAPBOX_INACTIVE_MESSAGE, is_active=False, is_global=True)
def delete_fake_soapbox_messages():
from acceptance_tests import (SOAPBOX_INACTIVE_MESSAGE, SOAPBOX_GLOBAL_MESSAGE, SOAPBOX_SINGLE_PAGE_MESSAGE,
SOAPBOX_SINGLE_PAGE_VIEW)
Message.objects.get(message=SOAPBOX_GLOBAL_MESSAGE, is_active=True, is_global=True).delete()
Message.objects.get(message=SOAPBOX_SINGLE_PAGE_MESSAGE, is_active=True, is_global=False,
url=SOAPBOX_SINGLE_PAGE_VIEW).delete()
Message.objects.get(message=SOAPBOX_INACTIVE_MESSAGE, is_active=False, is_global=True).delete()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment