from datetime import timedelta from random import randint import time import re from selenium.common.exceptions import TimeoutException 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 project.tests.factories import create_admin, create_batch_unique, User, UserFactory, Course, CourseFactory 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 def setUpTestData(cls): create_admin() 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('get ', reverse('courses')) resp = self.client.get(reverse('courses')) self.assertEqual(resp.status_code, 200) def test_course_url_accessible(self): for course in Course.objects.filter(status=Course.PUBLISHED): print('get ', course.url) resp = self.client.get(course.url) self.assertEqual(resp.status_code, 200) @login_admin def test_course_edit_url_accessible(self): 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): model = Course object_id = None object_data = {} @classmethod def setUpClass(cls): 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) self.assertNotEqual(request[2].get('response'), None) for key, value in self.object_data.items(): if key != 'content': self.assertEqual(getattr(obj, key), value) self.check_content_auto_saving(obj) def test_course_edit(self): user = User.objects.filter(role=User.AUTHOR_ROLE).first() self.login(user) url = self.get_url(reverse('course_create')) print('url is', url) self.driver.get(url) print('page opened', self.driver.current_url) self.add_requests_log() course_redactor = self.wait_elem_name('course-redactor') # visible always elements title_el = self.wait_elem_name('course-title') slug_el = self.wait_elem_name('course-slug') category_el = self.wait_elem_name('course-category') is_paid_no_el = self.wait_elem_name('course-is-paid-no') is_paid_yes_el = self.wait_elem_name('course-is-paid-yes') is_paid_input_el = self.wait_elem_css('[name=course-is-paid-input]:checked') age_el = self.wait_elem_name('course-age') # Only for ADMIN # is_featured_el = self.wait_elem_name('course-is-featured') is_deferred_no_el = self.wait_elem_name('course-is-deferred-no') is_deferred_yes_el = self.wait_elem_name('course-is-deferred-yes') is_deferred_input_el = self.wait_elem_name('course-is-deferred-input') content_btn_el = self.wait_elem_name('course-content-btn') lessons_btn_el = self.wait_elem_name('course-lessons-btn') content_el = self.wait_elem_name('course-content') title = Faker('sentence', nb_words=6).generate({}) title_el.send_keys(title) slug = slugify(unidecode(title[:90])) slug = re.sub(r'[^-\w]+$', '', slug) slug = re.sub(r'[^-\w]', '-', slug) self.object_data['title'] = title self.object_data['slug'] = slug time.sleep(1) self.assertEqual(slug_el.get_attribute('value'), slug) # check save obj = self.model.objects.get(title=title, slug=slug) 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')) self.assertRaises(TimeoutException, callable=lambda: self.driver.find_element_by_name('course-access-duration')) is_paid_yes_el.click() time.sleep(1) is_paid_input_el = self.wait_elem_css('[name=course-is-paid-input]:checked') self.assertEqual(is_paid_input_el.get_attribute('value'), 'true') try: price_el = self.wait_elem_name('course-price') old_price_el = self.wait_elem_name('course-old-price') access_duration_el = self.wait_elem_name('course-access-duration') except: self.fail('Price, old price and access_duration elements not shown') self.assertEqual(is_deferred_input_el.get_attribute('checked'), 'true') self.assertRaises(TimeoutException, callable=lambda: self.driver.find_element_by_name('course-date')) self.assertRaises(TimeoutException, callable=lambda: self.driver.find_element_by_name('course-time')) is_deferred_yes_el.click() try: date_el = self.wait_elem_name('course-date') time_el = self.wait_elem_name('course-time') except: self.fail('Date and time elements not shown') self.check_content(content_el) # 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')