survey/tests/test_survey_ui_session.py
2024-10-31 15:22:02 +03:00

223 lines
9.7 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from dateutil.relativedelta import relativedelta
from unittest.mock import patch
from odoo import fields
from odoo.tests.common import tagged, HttpCase
@tagged('post_install', '-at_install')
class TestUiSession(HttpCase):
def test_admin_survey_session(self):
""" This method tests a full 'survey session' flow.
Break down of different steps:
- Create the test data
- A scored survey
- A nickname question
- "Simple" type questions (text, date, datetime)
- A regular simple choice
- A scored simple choice
- A scored AND timed multiple choice
- Create a new survey session
- Register 3 attendees to it
- Open the session manager to check that our attendees are accounted for
- Create some answers to our survey questions.
- Then run the 'big' manage session tour (see JS doc for details)
- And finally check that our session and attendees inputs are correctly closed. """
# =======================
# CREATE SURVEY TEST DATA
# =======================
test_start_time = fields.Datetime.now()
survey_session = self.env['survey.survey'].create({
'title': 'User Session Survey',
'access_token': 'b137640d-14d4-4748-9ef6-344caaaaafe',
'access_mode': 'public',
'users_can_go_back': False,
'questions_layout': 'page_per_question',
'scoring_type': 'scoring_without_answers'
})
nickname_question = self.env['survey.question'].create({
'survey_id': survey_session.id,
'title': 'Nickname',
'save_as_nickname': True,
'sequence': 1,
'question_type': 'char_box',
})
text_question = self.env['survey.question'].create({
'survey_id': survey_session.id,
'title': 'Text Question',
'sequence': 2,
'question_type': 'char_box',
})
date_question = self.env['survey.question'].create({
'survey_id': survey_session.id,
'title': 'Date Question',
'sequence': 3,
'question_type': 'date',
})
datetime_question = self.env['survey.question'].create({
'survey_id': survey_session.id,
'title': 'Datetime Question',
'sequence': 4,
'question_type': 'datetime',
})
simple_choice_answer_1 = self.env['survey.question.answer'].create({
'value': 'First'
})
simple_choice_answer_2 = self.env['survey.question.answer'].create({
'value': 'Second'
})
simple_choice_answer_3 = self.env['survey.question.answer'].create({
'value': 'Third'
})
simple_choice_question = self.env['survey.question'].create({
'survey_id': survey_session.id,
'title': 'Regular Simple Choice',
'sequence': 5,
'question_type': 'simple_choice',
'suggested_answer_ids': [
(4, simple_choice_answer_1.id),
(4, simple_choice_answer_2.id),
(4, simple_choice_answer_3.id)],
})
scored_choice_answer_1 = self.env['survey.question.answer'].create({
'value': 'Correct',
'is_correct': True,
'answer_score': 30
})
scored_choice_answer_2 = self.env['survey.question.answer'].create({
'value': 'Incorrect 1'
})
scored_choice_answer_3 = self.env['survey.question.answer'].create({
'value': 'Incorrect 2'
})
scored_choice_answer_4 = self.env['survey.question.answer'].create({
'value': 'Incorrect 3'
})
scored_choice_question = self.env['survey.question'].create({
'survey_id': survey_session.id,
'title': 'Scored Simple Choice',
'sequence': 6,
'question_type': 'simple_choice',
'suggested_answer_ids': [
(4, scored_choice_answer_1.id),
(4, scored_choice_answer_2.id),
(4, scored_choice_answer_3.id),
(4, scored_choice_answer_4.id)],
})
timed_scored_choice_answer_1 = self.env['survey.question.answer'].create({
'value': 'Correct',
'is_correct': True,
'answer_score': 30
})
timed_scored_choice_answer_2 = self.env['survey.question.answer'].create({
'value': 'Also correct but less points',
'is_correct': True,
'answer_score': 10
})
timed_scored_choice_answer_3 = self.env['survey.question.answer'].create({
'value': 'Incorrect',
'answer_score': -40
})
timed_scored_choice_question = self.env['survey.question'].create({
'survey_id': survey_session.id,
'title': 'Timed Scored Multiple Choice',
'sequence': 6,
'question_type': 'multiple_choice',
'is_time_limited': True,
'time_limit': 1,
'suggested_answer_ids': [
(4, timed_scored_choice_answer_1.id),
(4, timed_scored_choice_answer_2.id),
(4, timed_scored_choice_answer_3.id)],
})
def action_open_session_manager_mock(self):
""" Mock original method to ensure we are not using another tab
as it creates issues with automated tours. """
return {
'type': 'ir.actions.act_url',
'name': "Open Session Manager",
'target': 'self',
'url': '/survey/session/manage/%s' % self.access_token
}
# =======================
# PART 1 : CREATE SESSION
# =======================
survey_session.action_start_session()
# tricky part: we only take into account answers created after the session_start_time
# the create_date of the answers we just saved is set to the beginning of the test.
# but the session_start_time is set after that.
# So we cheat on the session start date to be able to count answers properly.
survey_session.write({'session_start_time': test_start_time - relativedelta(minutes=10)})
attendee_1 = survey_session._create_answer()
attendee_2 = survey_session._create_answer()
attendee_3 = survey_session._create_answer()
all_attendees = [attendee_1, attendee_2, attendee_3]
self.assertEqual('ready', survey_session.session_state)
self.assertTrue(all(attendee.is_session_answer for attendee in all_attendees),
"Created answers should be within the session.")
self.assertTrue(all(attendee.state == 'new' for attendee in all_attendees),
"Created answers should be in the 'new' state.")
# =========================================
# PART 2 : OPEN SESSION AND CHECK ATTENDEES
# =========================================
with patch('odoo.addons.survey.models.survey_survey.Survey.action_open_session_manager', action_open_session_manager_mock):
self.start_tour('/web', 'test_survey_session_start_tour', login='admin')
self.assertEqual('in_progress', survey_session.session_state)
self.assertTrue(bool(survey_session.session_start_time))
# ========================================
# PART 3 : CREATE ANSWERS & MANAGE SESSION
# ========================================
# create a few answers beforehand to avoid having to back and forth too
# many times between the tours and the python test
attendee_1._save_lines(nickname_question, 'xxxTheBestxxx')
attendee_2._save_lines(nickname_question, 'azerty')
attendee_3._save_lines(nickname_question, 'nicktalope')
self.assertEqual('xxxTheBestxxx', attendee_1.nickname)
self.assertEqual('azerty', attendee_2.nickname)
self.assertEqual('nicktalope', attendee_3.nickname)
attendee_1._save_lines(text_question, 'Attendee 1 is the best')
attendee_2._save_lines(text_question, 'Attendee 2 rulez')
attendee_3._save_lines(text_question, 'Attendee 3 will crush you')
attendee_1._save_lines(date_question, '2010-10-10')
attendee_2._save_lines(date_question, '2011-11-11')
attendee_2._save_lines(datetime_question, '2010-10-10 10:00:00')
attendee_3._save_lines(datetime_question, '2011-11-11 15:55:55')
attendee_1._save_lines(simple_choice_question, simple_choice_answer_1.id)
attendee_2._save_lines(simple_choice_question, simple_choice_answer_1.id)
attendee_3._save_lines(simple_choice_question, simple_choice_answer_2.id)
attendee_1._save_lines(scored_choice_question, scored_choice_answer_1.id)
attendee_2._save_lines(scored_choice_question, scored_choice_answer_2.id)
attendee_3._save_lines(scored_choice_question, scored_choice_answer_3.id)
attendee_1._save_lines(timed_scored_choice_question,
[timed_scored_choice_answer_1.id, timed_scored_choice_answer_3.id])
attendee_2._save_lines(timed_scored_choice_question,
[timed_scored_choice_answer_1.id, timed_scored_choice_answer_2.id])
attendee_3._save_lines(timed_scored_choice_question,
[timed_scored_choice_answer_2.id])
with patch('odoo.addons.survey.models.survey_survey.Survey.action_open_session_manager', action_open_session_manager_mock):
self.start_tour('/web', 'test_survey_session_manage_tour', login='admin')
self.assertFalse(bool(survey_session.session_state))
self.assertTrue(all(answer.state == 'done' for answer in all_attendees))