Commit 6cd7e08c by Calen Pennington

Assert course equality in bulk, so that all differences are displayed

parent f1da4efb
...@@ -12,6 +12,7 @@ import os ...@@ -12,6 +12,7 @@ import os
import pprint import pprint
import unittest import unittest
from contextlib import contextmanager
from mock import Mock from mock import Mock
from path import path from path import path
...@@ -174,12 +175,64 @@ def map_references(value, field, actual_course_key): ...@@ -174,12 +175,64 @@ def map_references(value, field, actual_course_key):
return value return value
class CourseComparisonTest(unittest.TestCase): class BulkAssertionManager(object):
"""
This provides a facility for making a large number of assertions, and seeing all of
the failures at once, rather than only seeing single failures.
"""
def __init__(self, test_case):
self._equal_expected = []
self._equal_actual = []
self._test_case = test_case
def assertEqual(self, expected, actual, description=None):
if description is None:
description = "{!r} does not equal {!r}".format(expected, actual)
if expected != actual:
self._equal_expected.append((description, expected))
self._equal_actual.append((description, actual))
def run_assertions(self):
self._test_case.assertEqual(self._equal_expected, self._equal_actual)
class BulkAssertionTest(unittest.TestCase):
"""
This context manager provides a BulkAssertionManager to assert with,
and then calls `run_assertions` at the end of the block to validate all
of the assertions.
"""
def setUp(self, *args, **kwargs):
super(BulkAssertionTest, self).setUp(*args, **kwargs)
self._manager = None
@contextmanager
def bulk_assertions(self):
if self._manager:
yield
else:
try:
self._manager = BulkAssertionManager(self)
yield
finally:
self._manager.run_assertions()
self._manager = None
def assertEqual(self, expected, actual, message=None):
if self._manager is not None:
self._manager.assertEqual(expected, actual, message)
else:
super(BulkAssertionTest, self).assertEqual(expected, actual, message)
class CourseComparisonTest(BulkAssertionTest):
""" """
Mixin that has methods for comparing courses for equality. Mixin that has methods for comparing courses for equality.
""" """
def setUp(self): def setUp(self):
super(CourseComparisonTest, self).setUp()
self.field_exclusions = set() self.field_exclusions = set()
self.ignored_asset_keys = set() self.ignored_asset_keys = set()
...@@ -235,6 +288,7 @@ class CourseComparisonTest(unittest.TestCase): ...@@ -235,6 +288,7 @@ class CourseComparisonTest(unittest.TestCase):
self._assertCoursesEqual(expected_items, actual_items, actual_course_key, expect_drafts=True) self._assertCoursesEqual(expected_items, actual_items, actual_course_key, expect_drafts=True)
def _assertCoursesEqual(self, expected_items, actual_items, actual_course_key, expect_drafts=False): def _assertCoursesEqual(self, expected_items, actual_items, actual_course_key, expect_drafts=False):
with self.bulk_assertions():
self.assertEqual(len(expected_items), len(actual_items)) self.assertEqual(len(expected_items), len(actual_items))
actual_item_map = { actual_item_map = {
...@@ -339,6 +393,8 @@ class CourseComparisonTest(unittest.TestCase): ...@@ -339,6 +393,8 @@ class CourseComparisonTest(unittest.TestCase):
expected_content, expected_count = expected_store.get_all_content_for_course(expected_course_key) expected_content, expected_count = expected_store.get_all_content_for_course(expected_course_key)
actual_content, actual_count = actual_store.get_all_content_for_course(actual_course_key) actual_content, actual_count = actual_store.get_all_content_for_course(actual_course_key)
with self.bulk_assertions():
self.assertEqual(expected_count, actual_count) self.assertEqual(expected_count, actual_count)
self._assertAssetsEqual(expected_course_key, expected_content, actual_course_key, actual_content) self._assertAssetsEqual(expected_course_key, expected_content, actual_course_key, actual_content)
......
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