from datetime import timedelta from random import randint import time from selenium import webdriver 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 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(SeleniumTestCase): @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 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', url) self.driver.get(url) print('page opened', self.driver.current_url) # 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])) print('title', title, 'slug', slug) time.sleep(1) self.assertEqual(slug_el.get_attribute('value'), slug) 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(0.5) 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.assertFalse(is_deferred_input_el.get_attribute('checked')) 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') # 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')