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 ...@@ -47,12 +47,16 @@ endif
ifeq ("${ENABLE_COURSE_LIST_FILTERS}", "True") ifeq ("${ENABLE_COURSE_LIST_FILTERS}", "True")
./manage.py waffle_switch enable_course_filters on --create ./manage.py waffle_switch enable_course_filters on --create
endif endif
./manage.py create_acceptance_test_soapbox_messages
nosetests -v acceptance_tests -e NUM_PROCESSES=1 --exclude-dir=acceptance_tests/course_validation 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 # 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 # e.g. API_SERVER_URL="http://localhost:9001/api/v0" API_AUTH_TOKEN="edx" make accept_local
accept_local: accept_local:
./manage.py create_acceptance_test_soapbox_messages
nosetests -v acceptance_tests --exclude-dir=acceptance_tests/course_validation nosetests -v acceptance_tests --exclude-dir=acceptance_tests/course_validation
./manage.py delete_acceptance_test_soapbox_messages
a11y: a11y:
ifeq ("${DISPLAY_LEARNER_ANALYTICS}", "True") ifeq ("${DISPLAY_LEARNER_ANALYTICS}", "True")
......
...@@ -19,8 +19,8 @@ RESEARCH_URL = os.environ.get('RESEARCH_URL', 'http://example.com/') ...@@ -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)) SHOW_LANDING_RESEARCH = str2bool(os.environ.get('SHOW_LANDING_RESEARCH', True))
# Analytics data API settings # Analytics data API settings
API_SERVER_URL = os.environ['API_SERVER_URL'] API_SERVER_URL = os.environ.get('API_SERVER_URL', 'http://localhost:9001')
API_AUTH_TOKEN = os.environ['API_AUTH_TOKEN'] API_AUTH_TOKEN = os.environ.get('API_AUTH_TOKEN', 'edx')
# Test configuration # Test configuration
ENABLE_AUTO_AUTH = str2bool(os.environ.get('ENABLE_AUTO_AUTH', False)) 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', ...@@ -81,3 +81,10 @@ DISPLAY_LEARNER_ANALYTICS = str2bool(os.environ.get('DISPLAY_LEARNER_ANALYTICS',
# Learner analytics # Learner analytics
ENABLE_COURSE_LIST_FILTERS = str2bool(os.environ.get('ENABLE_COURSE_LIST_FILTERS', False)) 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 datetime
import locale
from unittest import skip from unittest import skip
from bok_choy.promise import EmptyPromise from bok_choy.promise import EmptyPromise
from analyticsclient.client import Client
from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.keys import Keys
from acceptance_tests import ( from acceptance_tests import (
API_SERVER_URL,
API_AUTH_TOKEN, API_AUTH_TOKEN,
API_SERVER_URL,
COURSE_API_KEY, COURSE_API_KEY,
COURSE_API_URL, COURSE_API_URL,
DASHBOARD_FEEDBACK_EMAIL, DASHBOARD_FEEDBACK_EMAIL,
...@@ -16,11 +15,16 @@ from acceptance_tests import ( ...@@ -16,11 +15,16 @@ from acceptance_tests import (
DOC_BASE_URL, DOC_BASE_URL,
ENABLE_AUTO_AUTH, ENABLE_AUTO_AUTH,
ENABLE_COURSE_API, ENABLE_COURSE_API,
LMS_USERNAME,
LMS_PASSWORD, LMS_PASSWORD,
LMS_USERNAME,
SOAPBOX_GLOBAL_MESSAGE,
SOAPBOX_INACTIVE_MESSAGE,
SOAPBOX_SINGLE_PAGE_MESSAGE,
SOAPBOX_SINGLE_PAGE_PATH,
SUPPORT_EMAIL, SUPPORT_EMAIL,
) )
from acceptance_tests.pages import LMSLoginPage from acceptance_tests.pages import LMSLoginPage
from analyticsclient.client import Client
from common.clients import CourseStructureApiClient from common.clients import CourseStructureApiClient
...@@ -270,8 +274,27 @@ class ContextSensitiveHelpMixin(object): ...@@ -270,8 +274,27 @@ class ContextSensitiveHelpMixin(object):
self.assertHrefEqual('#help', self.help_url) 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, class AnalyticsDashboardWebAppTestMixin(FooterMixin, PrimaryNavMixin, ContextSensitiveHelpMixin, AssertMixin,
LoginMixin): LoginMixin, SoapboxMessagesMixin):
def test_page(self): def test_page(self):
self.login() self.login()
self.page.visit() 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 ...@@ -2,6 +2,7 @@ import uuid
from copy import deepcopy from copy import deepcopy
from ddt import ddt from ddt import ddt
from mock import call, MagicMock, patch
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
...@@ -10,13 +11,31 @@ from django.test import TestCase ...@@ -10,13 +11,31 @@ from django.test import TestCase
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from core.utils import (CourseStructureApiClient, delete_auto_auth_users, sanitize_cache_key, translate_dict_values, from core.utils import (CourseStructureApiClient, delete_auto_auth_users, sanitize_cache_key, translate_dict_values,
remove_keys) remove_keys, Message)
User = get_user_model() User = get_user_model()
class UtilsTests(TestCase): 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): def test_delete_auto_auth_users(self):
# Create an auto-auth user # Create an auto-auth user
username = password = settings.AUTO_AUTH_USERNAME_PREFIX + uuid.uuid4().hex[0:20] username = password = settings.AUTO_AUTH_USERNAME_PREFIX + uuid.uuid4().hex[0:20]
...@@ -98,6 +117,31 @@ class UtilsTests(TestCase): ...@@ -98,6 +117,31 @@ class UtilsTests(TestCase):
self.assertDictEqual(remove_keys(dict_of_dicts, {'foo': {'bar': ('fizz',)}, '': ('flat',)}), self.assertDictEqual(remove_keys(dict_of_dicts, {'foo': {'bar': ('fizz',)}, '': ('flat',)}),
dict_of_dicts_no_fizz) 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 @ddt
class CourseStructureApiClientTests(TestCase): class CourseStructureApiClientTests(TestCase):
......
from hashlib import md5 from hashlib import md5
from soapbox.models import Message
from waffle import switch_is_active from waffle import switch_is_active
from django.conf import settings from django.conf import settings
...@@ -99,3 +100,22 @@ def remove_keys(d, keys): ...@@ -99,3 +100,22 @@ def remove_keys(d, keys):
if key in keys: if key in keys:
del d[key] del d[key]
return d 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