|
|
|
|
@ -8,16 +8,16 @@ from factory.faker import Faker |
|
|
|
|
from django.utils import timezone |
|
|
|
|
from django.test import TestCase |
|
|
|
|
from django.shortcuts import reverse |
|
|
|
|
from django.conf import settings |
|
|
|
|
from django.utils.text import slugify |
|
|
|
|
from unidecode import unidecode |
|
|
|
|
from selenium.webdriver.common.by import By |
|
|
|
|
from django.utils.html import strip_tags |
|
|
|
|
|
|
|
|
|
from project.tests.factories import create_admin, create_batch_unique, User, UserFactory, Course, CourseFactory |
|
|
|
|
from project.tests.factories import create_admin, create_batch_unique, User, UserFactory, Course, CourseFactory, login_admin |
|
|
|
|
from project.tests import SeleniumTestCase |
|
|
|
|
from apps.content.tests.mixins import TestContentMixin |
|
|
|
|
from project.utils.selenium_utils import SeleniumExtensions as SE |
|
|
|
|
|
|
|
|
|
''' |
|
|
|
|
|
|
|
|
|
class CoursesTestCase(TestCase): |
|
|
|
|
|
|
|
|
|
@classmethod |
|
|
|
|
@ -26,17 +26,14 @@ class CoursesTestCase(TestCase): |
|
|
|
|
create_batch_unique(CourseFactory, status=Course.STATUS_CHOICES[:3], price=[0, 1000], |
|
|
|
|
age=Course.AGE_CHOICES[:2], deferred_start_at=[None, timezone.now() + timedelta(days=randint(5, 15))]) |
|
|
|
|
|
|
|
|
|
@classmethod |
|
|
|
|
def tearDownClass(cls): |
|
|
|
|
print('teardown CoursesTestCase') |
|
|
|
|
super().tearDownClass() |
|
|
|
|
|
|
|
|
|
def test_courses_url_accessible(self): |
|
|
|
|
print('test_courses_url_accessible') |
|
|
|
|
print('get ', reverse('courses')) |
|
|
|
|
resp = self.client.get(reverse('courses')) |
|
|
|
|
self.assertEqual(resp.status_code, 200) |
|
|
|
|
|
|
|
|
|
def test_course_url_accessible(self): |
|
|
|
|
print('test_course_url_accessible') |
|
|
|
|
for course in Course.objects.filter(status=Course.PUBLISHED): |
|
|
|
|
print('get ', course.url) |
|
|
|
|
resp = self.client.get(course.url) |
|
|
|
|
@ -44,11 +41,11 @@ class CoursesTestCase(TestCase): |
|
|
|
|
|
|
|
|
|
@login_admin |
|
|
|
|
def test_course_edit_url_accessible(self): |
|
|
|
|
print('test_course_edit_url_accessible') |
|
|
|
|
for course in Course.objects.all(): |
|
|
|
|
print('get ', reverse('course_edit', args=[course.id])) |
|
|
|
|
resp = self.client.get(reverse('course_edit', args=[course.id])) |
|
|
|
|
self.assertEqual(resp.status_code, 200) |
|
|
|
|
''' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CourseEditTestCase(TestContentMixin, SeleniumTestCase): |
|
|
|
|
@ -61,26 +58,31 @@ class CourseEditTestCase(TestContentMixin, SeleniumTestCase): |
|
|
|
|
super().setUpClass() |
|
|
|
|
create_admin() |
|
|
|
|
UserFactory.create_batch(5, role=User.AUTHOR_ROLE) |
|
|
|
|
# create_batch_unique(CourseFactory, status=Course.STATUS_CHOICES[:3], price=[0, 1000], |
|
|
|
|
# age=Course.AGE_CHOICES[:2], deferred_start_at=[None, timezone.now() + timedelta(days=randint(5, 15))]) |
|
|
|
|
|
|
|
|
|
@classmethod |
|
|
|
|
def tearDownClass(cls): |
|
|
|
|
print('teardown CourseEditTestCase') |
|
|
|
|
super().tearDownClass() |
|
|
|
|
|
|
|
|
|
def check_auto_saving(self): |
|
|
|
|
time.sleep(0.5) |
|
|
|
|
request = self.wait_for_request(f'/api/v1/courses/{self.object_id}/') |
|
|
|
|
obj = self.model.objects.get(id=self.object_id) |
|
|
|
|
self.assertEqual(request[2].get('status'), 200) |
|
|
|
|
def check_saving(self, url=None, response_code=200): |
|
|
|
|
print('Check saving') |
|
|
|
|
time.sleep(1) |
|
|
|
|
request = self.wait_for_request(url or f'/api/v1/courses/{self.object_id}/') |
|
|
|
|
self.assertEqual(request[2].get('status'), response_code) |
|
|
|
|
self.assertNotEqual(request[2].get('response'), None) |
|
|
|
|
obj = self.model.objects.get(id=self.object_id) |
|
|
|
|
for key, value in self.object_data.items(): |
|
|
|
|
if key != 'content': |
|
|
|
|
if key not in ['content', 'lessons']: |
|
|
|
|
self.assertEqual(getattr(obj, key), value) |
|
|
|
|
self.check_content_auto_saving(obj) |
|
|
|
|
self.check_content_saving(obj) |
|
|
|
|
self.check_lessons_saving(obj) |
|
|
|
|
|
|
|
|
|
def check_lessons_saving(self, obj): |
|
|
|
|
print('Check lessons saving', ) |
|
|
|
|
lessons = self.object_data.get('lessons', []) |
|
|
|
|
self.assertEqual(obj.lessons.all().count(), len(lessons)) |
|
|
|
|
for i, lesson in enumerate(obj.lessons.all().order_by('title',)): |
|
|
|
|
self.assertEqual(strip_tags(lesson.short_description), lessons[i]['short_description']) |
|
|
|
|
self.assertEqual(lesson.title, lessons[i]['title']) |
|
|
|
|
print('OK') |
|
|
|
|
|
|
|
|
|
def test_course_edit(self): |
|
|
|
|
print('test_course_edit') |
|
|
|
|
user = User.objects.filter(role=User.AUTHOR_ROLE).first() |
|
|
|
|
self.login(user) |
|
|
|
|
url = self.get_url(reverse('course_create')) |
|
|
|
|
@ -122,7 +124,6 @@ class CourseEditTestCase(TestContentMixin, SeleniumTestCase): |
|
|
|
|
self.assertEqual(bool(obj), True) |
|
|
|
|
self.object_id = obj.id |
|
|
|
|
|
|
|
|
|
print("is_paid_input_el.get_attribute('checked')", is_paid_input_el.get_attribute('checked')) |
|
|
|
|
self.assertEqual(is_paid_input_el.get_attribute('value'), 'false') |
|
|
|
|
self.assertRaises(TimeoutException, callable=lambda: self.driver.find_element_by_name('course-price')) |
|
|
|
|
self.assertRaises(TimeoutException, callable=lambda: self.driver.find_element_by_name('course-old-price')) |
|
|
|
|
@ -148,10 +149,48 @@ class CourseEditTestCase(TestContentMixin, SeleniumTestCase): |
|
|
|
|
except: |
|
|
|
|
self.fail('Date and time elements not shown') |
|
|
|
|
|
|
|
|
|
price_el.send_keys(1000) |
|
|
|
|
self.object_data['price'] = 1000 |
|
|
|
|
old_price_el.send_keys(1500) |
|
|
|
|
self.object_data['old_price'] = 1500 |
|
|
|
|
access_duration_el.send_keys(15) |
|
|
|
|
self.object_data['access_duration'] = 15 |
|
|
|
|
self.check_saving() |
|
|
|
|
|
|
|
|
|
self.check_content(content_el) |
|
|
|
|
|
|
|
|
|
lessons_btn_el.click() |
|
|
|
|
time.sleep(0.5) |
|
|
|
|
# lessons_el = self.wait_elem_name('course-lessons') |
|
|
|
|
# add_lesson_el = self.wait_elem_name('course-add-lesson') |
|
|
|
|
# lesson_edit_el = self.wait_elem_name('course-lesson-edit') |
|
|
|
|
# stream_el = self.wait_elem_name('course-stream') |
|
|
|
|
add_lesson_el = self.wait_elem_name('course-add-lesson') |
|
|
|
|
|
|
|
|
|
add_lesson_el.click() |
|
|
|
|
time.sleep(0.5) |
|
|
|
|
|
|
|
|
|
lesson_title_el = self.wait_elem_name('course-lesson-title') |
|
|
|
|
lesson_text_el = self.wait_elem_name('course-lesson-text-wrap').find_element( |
|
|
|
|
By.XPATH, './/div[contains(@class, "redactor-layer")][@contenteditable]') |
|
|
|
|
lesson_save_btn_el = self.wait_elem_name('course-lesson-save') |
|
|
|
|
|
|
|
|
|
lesson = {} |
|
|
|
|
title = Faker('sentence', nb_words=6).generate({}) |
|
|
|
|
lesson_title_el.send_keys(title) |
|
|
|
|
lesson['title'] = title |
|
|
|
|
|
|
|
|
|
text = Faker('sentence', nb_words=50).generate({}) |
|
|
|
|
lesson_text_el.click() |
|
|
|
|
lesson_text_el.send_keys(text) |
|
|
|
|
time.sleep(0.5) |
|
|
|
|
|
|
|
|
|
lesson_save_btn_el.click() |
|
|
|
|
self.object_data['lessons'] = [{ |
|
|
|
|
'title': title, |
|
|
|
|
'short_description': text |
|
|
|
|
}] |
|
|
|
|
self.check_saving('/api/v1/lessons/', 201) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|