Commit 2707988e by Clinton Blackburn Committed by Clinton Blackburn

Updated publisher app factories

- Added ability to specify Course organizations at creation time
- Removed hard-coded values

LEARNER-2460
parent adc154ec
......@@ -4,10 +4,15 @@ from django.contrib.sites.models import Site
from course_discovery.apps.core.models import Partner, User
from course_discovery.apps.core.tests.utils import FuzzyUrlRoot
USER_PASSWORD = 'password'
def add_m2m_data(m2m_relation, data):
""" Helper function to enable factories to easily associate many-to-many data with created objects. """
if data:
m2m_relation.add(*data)
class SiteFactory(factory.DjangoModelFactory):
class Meta:
model = Site
......
......@@ -4,7 +4,7 @@ import factory
from factory.fuzzy import FuzzyChoice, FuzzyDateTime, FuzzyDecimal, FuzzyInteger, FuzzyText
from pytz import UTC
from course_discovery.apps.core.tests.factories import PartnerFactory
from course_discovery.apps.core.tests.factories import PartnerFactory, add_m2m_data
from course_discovery.apps.core.tests.utils import FuzzyURL
from course_discovery.apps.course_metadata.models import * # pylint: disable=wildcard-import
from course_discovery.apps.ietf_language_tags.models import LanguageTag
......@@ -12,12 +12,6 @@ from course_discovery.apps.ietf_language_tags.models import LanguageTag
# pylint: disable=no-member, unused-argument
def add_m2m_data(m2m_relation, data):
""" Helper function to enable factories to easily associate many-to-many data with created objects. """
if data:
for datum in data:
m2m_relation.add(datum)
class AbstractMediaModelFactory(factory.DjangoModelFactory):
src = FuzzyURL()
......
......@@ -7,7 +7,7 @@ from factory.fuzzy import FuzzyChoice, FuzzyDateTime, FuzzyDecimal, FuzzyInteger
from pytz import UTC
from course_discovery.apps.core.models import Currency
from course_discovery.apps.core.tests.factories import UserFactory
from course_discovery.apps.core.tests.factories import UserFactory, add_m2m_data
from course_discovery.apps.course_metadata.choices import CourseRunPacing
from course_discovery.apps.course_metadata.tests import factories
from course_discovery.apps.ietf_language_tags.models import LanguageTag
......@@ -19,21 +19,26 @@ from course_discovery.apps.publisher.models import (
class CourseFactory(factory.DjangoModelFactory):
title = FuzzyText(prefix="Test çօմɾʂҽ ")
short_description = FuzzyText(prefix="Test çօմɾʂҽ short description")
full_description = FuzzyText(prefix="Test çօմɾʂҽ FULL description")
title = FuzzyText()
short_description = FuzzyText()
full_description = FuzzyText()
number = FuzzyText()
prerequisites = "prereq 1, prereq 2, prereq 3"
expected_learnings = "learning 1, learning 2, learning 3"
syllabus = "week 1: awesomeness"
learner_testimonial = "Best course ever!"
prerequisites = FuzzyText()
expected_learnings = FuzzyText()
syllabus = FuzzyText()
learner_testimonial = FuzzyText()
level_type = factory.SubFactory(factories.LevelTypeFactory)
primary_subject = factory.SubFactory(factories.SubjectFactory)
secondary_subject = factory.SubFactory(factories.SubjectFactory)
tertiary_subject = factory.SubFactory(factories.SubjectFactory)
faq = FuzzyText(prefix='Frequently asked questions')
video_link = FuzzyText(prefix='http://video.com/çօմɾʂҽ/')
faq = FuzzyText()
video_link = factory.Faker('url')
@factory.post_generation
def organizations(self, create, extracted, **kwargs): # pylint: disable=unused-argument
if create:
add_m2m_data(self.organizations, extracted)
class Meta:
model = Course
......@@ -49,10 +54,10 @@ class CourseRunFactory(factory.DjangoModelFactory):
min_effort = FuzzyInteger(1, 10)
max_effort = FuzzyInteger(10, 20)
language = factory.Iterator(LanguageTag.objects.all())
pacing_type = FuzzyChoice([name for name, __ in CourseRunPacing.choices])
pacing_type = FuzzyChoice(CourseRunPacing.values.keys())
length = FuzzyInteger(1, 10)
notes = "Testing notes"
preview_url = FuzzyText(prefix='https://example.com/')
notes = FuzzyText()
preview_url = factory.Faker('url')
contacted_partner_manager = FuzzyChoice((True, False))
video_language = factory.Iterator(LanguageTag.objects.all())
short_description_override = FuzzyText()
......@@ -76,7 +81,7 @@ class SeatFactory(factory.DjangoModelFactory):
class GroupFactory(factory.DjangoModelFactory):
name = FuzzyText(prefix="Test Group ")
name = FuzzyText()
class Meta:
model = Group
......
......@@ -146,11 +146,8 @@ class OrganizationUserRoleAdminTests(SiteMixin, TestCase):
self.organization = OrganizationFactory()
self.course1 = CourseFactory()
self.course2 = CourseFactory()
self.course1.organizations.add(self.organization)
self.course2.organizations.add(self.organization)
self.course1 = CourseFactory(organizations=[self.organization])
self.course2 = CourseFactory(organizations=[self.organization])
@ddt.data(
(PublisherUserRole.MarketingReviewer, REVIEWER_GROUP_NAME),
......@@ -184,14 +181,12 @@ class OrganizationUserRoleAdminTests(SiteMixin, TestCase):
"""
# for course 3 add course roles
user = UserFactory()
course3 = CourseFactory()
course3.organizations.add(self.organization)
course3 = CourseFactory(organizations=[self.organization])
factories.CourseUserRoleFactory(course=course3, role=PublisherUserRole.MarketingReviewer, user=user)
# for course 4 add course roles
project_coordinator = UserFactory()
course4 = CourseFactory()
course4.organizations.add(self.organization)
course4 = CourseFactory(organizations=[self.organization])
factories.CourseUserRoleFactory(course=course4, role=PublisherUserRole.ProjectCoordinator,
user=project_coordinator)
......
......@@ -192,9 +192,8 @@ class PublisherCustomCourseFormTests(TestCase):
def setUp(self):
super(PublisherCustomCourseFormTests, self).setUp()
self.course_form = CustomCourseForm()
self.course = CourseFactory(title="Test", number="a123")
self.organization = OrganizationFactory()
self.course.organizations.add(self.organization)
self.course = CourseFactory(title='Test', number='a123', organizations=[self.organization])
def setup_course(self, **course_kwargs):
"""
......@@ -204,13 +203,16 @@ class PublisherCustomCourseFormTests(TestCase):
course: a course object
course_admin: a user object
"""
course = CourseFactory(**course_kwargs)
course_admin = UserFactory(username='course_admin')
organization_extension = OrganizationExtensionFactory()
organization = organization_extension.organization
defaults = {
'organizations': [organization_extension.organization],
}
defaults.update(course_kwargs)
course = CourseFactory(**defaults)
course_admin = UserFactory()
course_admin.groups.add(organization_extension.group)
course.organizations.add(organization)
return course, course_admin
def test_duplicate_title(self):
......@@ -245,7 +247,7 @@ class PublisherCustomCourseFormTests(TestCase):
updating the course
"""
course, course_admin = self.setup_course(title='test_course')
organization = course.organizations.all()[0].id
organization = course.organizations.first().id
course_from_data = {
'title': 'áçã',
'number': course.number,
......
......@@ -151,22 +151,19 @@ class CourseTests(TestCase):
def setUp(self):
super(CourseTests, self).setUp()
self.course = factories.CourseFactory()
self.course2 = factories.CourseFactory()
self.org_extension_1 = factories.OrganizationExtensionFactory()
self.org_extension_2 = factories.OrganizationExtensionFactory()
self.course = factories.CourseFactory(organizations=[self.org_extension_1.organization])
self.course2 = factories.CourseFactory(organizations=[self.org_extension_2.organization])
self.user1 = UserFactory()
self.user2 = UserFactory()
self.user3 = UserFactory()
self.org_extension_1 = factories.OrganizationExtensionFactory()
self.org_extension_2 = factories.OrganizationExtensionFactory()
self.user1.groups.add(self.org_extension_1.group)
self.user2.groups.add(self.org_extension_2.group)
self.course.organizations.add(self.org_extension_1.organization)
self.course2.organizations.add(self.org_extension_2.organization)
# add user in course-user-role table
factories.CourseUserRoleFactory(
course=self.course, role=PublisherUserRole.ProjectCoordinator, user=self.user1
......
......@@ -28,11 +28,10 @@ class PublisherUtilsTests(TestCase):
def setUp(self):
super(PublisherUtilsTests, self).setUp()
self.user = UserFactory()
self.course = factories.CourseFactory()
self.organization_extension = factories.OrganizationExtensionFactory()
self.course = factories.CourseFactory(organizations=[self.organization_extension.organization])
self.admin_group = Group.objects.get(name=ADMIN_GROUP_NAME)
self.internal_user_group = Group.objects.get(name=INTERNAL_USER_GROUP_NAME)
self.organization_extension = factories.OrganizationExtensionFactory()
self.course.organizations.add(self.organization_extension.organization)
def test_email_notification_enabled_by_default(self):
""" Test email notification is enabled for the user by default."""
......
......@@ -62,10 +62,8 @@ class CreateCourseViewTests(SiteMixin, TestCase):
self.group = self.organization_extension.group
self.user.groups.add(self.group)
# create base course object
self.course = factories.CourseFactory()
self.course = factories.CourseFactory(organizations=[self.organization_extension.organization])
self.course.organizations.add(self.organization_extension.organization)
self.client.login(username=self.user.username, password=USER_PASSWORD)
# creating default organizations roles
......@@ -551,9 +549,8 @@ class CreateCourseRunViewTests(SiteMixin, TestCase):
"""
Verify that user can create a new course run with credit seat.
"""
course = factories.CourseFactory()
organization_extension = factories.OrganizationExtensionFactory()
course.organizations.add(organization_extension.organization)
course = factories.CourseFactory(organizations=[organization_extension.organization])
self.user.groups.add(organization_extension.group)
response = self.client.post(
......@@ -570,16 +567,13 @@ class CourseRunDetailTests(SiteMixin, TestCase):
def setUp(self):
super(CourseRunDetailTests, self).setUp()
self.course = factories.CourseFactory()
self.user = UserFactory()
self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME))
self.client.login(username=self.user.username, password=USER_PASSWORD)
self.course_run = factories.CourseRunFactory(course=self.course)
self.course_run.lms_course_id = 'course-v1:edX+DemoX+Demo_Course'
self.course_run.save()
self.organization_extension = factories.OrganizationExtensionFactory()
self.course.organizations.add(self.organization_extension.organization)
self.client.login(username=self.user.username, password=USER_PASSWORD)
self.course_run = factories.CourseRunFactory(course__organizations=[self.organization_extension.organization],
lms_course_id='course-v1:edX+DemoX+Demo_Course')
self.course = self.course_run.course
self._generate_seats([Seat.AUDIT, Seat.HONOR, Seat.VERIFIED, Seat.PROFESSIONAL])
self._generate_credit_seat()
......@@ -793,7 +787,7 @@ class CourseRunDetailTests(SiteMixin, TestCase):
""" Verify that `PublisherPermissionMixin.get_course` return none
if `publisher_object` doesn't have `course` attr.
"""
non_staff_user, group = create_non_staff_user_and_login(self) # pylint: disable=unused-variable
non_staff_user, group = create_non_staff_user_and_login(self) # pylint: disable=unused-variable
page_url = reverse('publisher:publisher_course_run_detail', args=[self.course_run.id])
with mock.patch.object(CourseRunDetailView, 'get_object', return_value=non_staff_user):
response = self.client.get(page_url)
......@@ -1750,7 +1744,8 @@ class CourseListViewPaginationTests(PaginationMixin, TestCase):
]
# create 10 courses with related objects
for index in range(10):
course = factories.CourseFactory(title=self.course_titles[index])
course = factories.CourseFactory(title=self.course_titles[index],
organizations=[OrganizationFactory(key=self.course_organizations[index])])
for _ in range(random.randrange(1, 10)):
factories.CourseRunFactory(course=course)
......@@ -1758,8 +1753,6 @@ class CourseListViewPaginationTests(PaginationMixin, TestCase):
course_state.owner_role_modified = self.course_dates[index]
course_state.save()
course.organizations.add(OrganizationFactory(key=self.course_organizations[index]))
self.courses.append(course)
self.course = self.courses[0]
......@@ -1979,13 +1972,11 @@ class CourseDetailViewTests(TestCase):
def setUp(self):
super(CourseDetailViewTests, self).setUp()
self.course = factories.CourseFactory()
self.organization_extension = factories.OrganizationExtensionFactory()
self.course = factories.CourseFactory(organizations=[self.organization_extension.organization])
self.user = UserFactory()
self.client.login(username=self.user.username, password=USER_PASSWORD)
self.organization_extension = factories.OrganizationExtensionFactory()
self.course.organizations.add(self.organization_extension.organization)
# Initialize workflow for Course.
self.course_state = factories.CourseStateFactory(course=self.course, owner_role=PublisherUserRole.CourseTeam)
......@@ -2318,15 +2309,7 @@ class CourseDetailViewTests(TestCase):
self.user.groups.add(self.organization_extension.group)
assign_perm(OrganizationExtension.VIEW_COURSE, self.organization_extension.group, self.organization_extension)
response = self.client.get(self.detail_page_url)
# Verify that user cannot see history widget if there is only one history object.
self.assertEqual(self.course.history.count(), 1)
self.assertNotContains(response, 'REVISION HISTORY')
# Update course to create multiple history objects.
self.course.title = 'Updated Test Title'
self.course.save()
self.assertGreater(self.course.history.count(), 0)
response = self.client.get(self.detail_page_url)
......@@ -2411,14 +2394,12 @@ class CourseEditViewTests(SiteMixin, TestCase):
def setUp(self):
super(CourseEditViewTests, self).setUp()
self.course = factories.CourseFactory()
self.organization_extension = factories.OrganizationExtensionFactory()
self.course = factories.CourseFactory(organizations=[self.organization_extension.organization])
self.user = UserFactory()
self.course_team_user = UserFactory()
self.client.login(username=self.user.username, password=USER_PASSWORD)
self.organization_extension = factories.OrganizationExtensionFactory()
self.course.organizations.add(self.organization_extension.organization)
# Initialize workflow for Course.
CourseState.objects.create(course=self.course, owner_role=PublisherUserRole.CourseTeam)
......@@ -2465,10 +2446,6 @@ class CourseEditViewTests(SiteMixin, TestCase):
"""
Verify that publisher admin can update an existing course.
"""
# only 1 history object exists for a course.
self.assertEqual(self.course.history.all().count(), 1)
self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME))
post_data = self._post_data(self.organization_extension)
......@@ -2494,9 +2471,6 @@ class CourseEditViewTests(SiteMixin, TestCase):
self.assertEqual(course.changed_by, self.user)
self.assertEqual(course.short_description, 'Testing description')
# After updating 2 history object exists for a course.
self.assertEqual(self.course.history.all().count(), 2)
def test_update_course_with_non_internal_user(self):
"""
Verify that non-internal user cannot update the course.
......@@ -2530,7 +2504,6 @@ class CourseEditViewTests(SiteMixin, TestCase):
)
self.assertEqual(self.course.course_team_admin, self.course_team_user)
self.assertEqual(self.course.history.all().count(), 2)
def test_update_course_organization(self):
"""
......@@ -2555,7 +2528,6 @@ class CourseEditViewTests(SiteMixin, TestCase):
)
self.assertEqual(self.course.organizations.first(), organization_extension.organization)
self.assertEqual(self.course.history.all().count(), 2)
def _assign_permissions(self, organization_extension):
"""
......@@ -2871,11 +2843,10 @@ class CourseRunEditViewTests(SiteMixin, TestCase):
self.group_project_coordinator = Group.objects.get(name=PROJECT_COORDINATOR_GROUP_NAME)
self.course = factories.CourseFactory()
self.course_run = factories.CourseRunFactory(course=self.course)
self.course_run = factories.CourseRunFactory(course__organizations=[self.organization_extension.organization])
self.course = self.course_run.course
self.seat = factories.SeatFactory(course_run=self.course_run, type=Seat.VERIFIED, price=2)
self.course.organizations.add(self.organization_extension.organization)
self.client.login(username=self.user.username, password=USER_PASSWORD)
current_datetime = datetime.now(timezone('US/Central'))
self.start_date_time = (current_datetime + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')
......@@ -3445,7 +3416,8 @@ class CreateRunFromDashboardViewTests(SiteMixin, TestCase):
def setUp(self):
super(CreateRunFromDashboardViewTests, self).setUp()
self.user = UserFactory()
self.course = factories.CourseFactory()
self.organization_extension = factories.OrganizationExtensionFactory()
self.course = factories.CourseFactory(organizations=[self.organization_extension.organization])
factories.CourseStateFactory(course=self.course)
factories.CourseUserRoleFactory.create(course=self.course, role=PublisherUserRole.CourseTeam, user=self.user)
factories.CourseUserRoleFactory.create(course=self.course, role=PublisherUserRole.Publisher, user=UserFactory())
......@@ -3456,8 +3428,6 @@ class CreateRunFromDashboardViewTests(SiteMixin, TestCase):
course=self.course, role=PublisherUserRole.MarketingReviewer, user=UserFactory()
)
self.organization_extension = factories.OrganizationExtensionFactory()
self.course.organizations.add(self.organization_extension.organization)
self.user.groups.add(self.organization_extension.group)
assign_perm(
......
......@@ -21,12 +21,9 @@ class CourseRunWrapperTests(TestCase):
def setUp(self):
super(CourseRunWrapperTests, self).setUp()
self.course_run = factories.CourseRunFactory()
self.course = self.course_run.course
organization = OrganizationFactory()
self.course.organizations.add(organization)
self.course.save()
self.course_run = factories.CourseRunFactory(course__organizations=[organization])
self.course = self.course_run.course
self.wrapped_course_run = CourseRunWrapper(self.course_run)
......@@ -72,13 +69,8 @@ class CourseRunWrapperTests(TestCase):
def test_organization_key(self):
""" Verify that the wrapper return the organization key. """
course = factories.CourseFactory()
course_run = factories.CourseRunFactory(course=course)
wrapped_course_run = CourseRunWrapper(course_run)
self.assertEqual(wrapped_course_run.organization_key, None)
organization = OrganizationFactory()
course.organizations.add(organization)
course_run = factories.CourseRunFactory(course__organizations=[organization])
wrapped_course_run = CourseRunWrapper(course_run)
self.assertEqual(wrapped_course_run.organization_key, organization.key)
......@@ -110,13 +102,8 @@ class CourseRunWrapperTests(TestCase):
def test_organization_name(self):
""" Verify that the wrapper return the organization name. """
course = factories.CourseFactory()
course_run = factories.CourseRunFactory(course=course)
wrapped_course_run = CourseRunWrapper(course_run)
self.assertEqual(wrapped_course_run.organization_name, None)
organization = OrganizationFactory()
course.organizations.add(organization)
course_run = factories.CourseRunFactory(course__organizations=[organization])
wrapped_course_run = CourseRunWrapper(course_run)
self.assertEqual(wrapped_course_run.organization_name, organization.name)
......
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