# Part of Odoo. See LICENSE file for full copyright and licensing details. import odoo.tests from odoo import Command from odoo.addons.base.tests.common import HttpCaseWithUserDemo @odoo.tests.common.tagged('post_install', '-at_install') class TestUiFeedback(HttpCaseWithUserDemo): def setUp(self): super(TestUiFeedback, self).setUp() self.survey_feedback = self.env['survey.survey'].create({ 'title': 'User Feedback Form', 'access_token': 'b137640d-14d4-4748-9ef6-344caaaaaae', 'access_mode': 'public', 'users_can_go_back': True, 'questions_layout': 'page_per_section', 'description': """

This survey allows you to give a feedback about your experience with our eCommerce solution. Filling it helps us improving your experience.

""", 'question_and_page_ids': [ (0, 0, { 'title': 'General information', 'sequence': 1, 'question_type': False, 'is_page': True, 'description': """

This section is about general information about you. Answering them helps qualifying your answers.

""", }), (0, 0, { 'title': 'Where do you live?', 'sequence': 2, 'question_type': 'char_box', 'constr_mandatory': False, }), (0, 0, { 'title': 'When is your date of birth?', 'sequence': 3, 'question_type': 'date', 'description': False, }), (0, 0, { 'title': 'How frequently do you buy products online?', 'sequence': 4, 'question_type': 'simple_choice', 'comments_allowed': True, 'comment_count_as_answer': True, 'constr_mandatory': True, 'suggested_answer_ids': [ (0, 0, { 'value': 'Once a day', 'sequence': 1, }), (0, 0, { 'value': 'Once a week', 'sequence': 2, }), (0, 0, { 'value': 'Once a month', 'sequence': 3, }), (0, 0, { 'value': 'Once a year', 'sequence': 4, }), (0, 0, { 'value': 'Other (answer in comment)', 'sequence': 5, })], }), (0, 0, { 'title': 'How many times did you order products on our website?', 'sequence': 5, 'question_type': 'numerical_box', 'constr_mandatory': True, }), (0, 0, { 'title': 'About our ecommerce', 'sequence': 6, 'is_page': True, 'question_type': False, 'description': """

This section is about our eCommerce experience itself.

""", }), (0, 0, { 'title': 'Which of the following words would you use to describe our products?', 'sequence': 7, 'question_type': 'multiple_choice', 'constr_mandatory': True, 'comments_allowed': True, 'comment_count_as_answer': False, 'suggested_answer_ids': [ (0, 0, { 'value': 'High quality', 'sequence': 1, }), (0, 0, { 'value': 'Useful', 'sequence': 2, }), (0, 0, { 'value': 'Unique', 'sequence': 3, }), (0, 0, { 'value': 'Good value for money', 'sequence': 4, }), (0, 0, { 'value': 'Overpriced', 'sequence': 5, }), (0, 0, { 'value': 'Impractical', 'sequence': 6, }), (0, 0, { 'value': 'Ineffective', 'sequence': 7, }), (0, 0, { 'value': 'Poor quality', 'sequence': 8, }), (0, 0, { 'value': 'Other', 'sequence': 9, })], }), (0, 0, { 'title': 'What do your think about our new eCommerce?', 'sequence': 8, 'question_type': 'matrix', 'matrix_subtype': 'multiple', 'constr_mandatory': True, 'suggested_answer_ids': [(0, 0, { 'value': 'Totally disagree', 'sequence': 1 }), (0, 0, { 'value': 'Disagree', 'sequence': 2, }), (0, 0, { 'value': 'Agree', 'sequence': 3, }), (0, 0, { 'value': 'Totally agree', 'sequence': 4, })], 'matrix_row_ids': [(0, 0, { 'value': 'The new layout and design is fresh and up-to-date', 'sequence': 1, }), (0, 0, { 'value': 'It is easy to find the product that I want', 'sequence': 2, }), (0, 0, { 'value': 'The tool to compare the products is useful to make a choice', 'sequence': 3, }), (0, 0, { 'value': 'The checkout process is clear and secure', 'sequence': 4, }), (0, 0, { 'value': 'I have added products to my wishlist', 'sequence': 5, })], }), (0, 0, { 'title': 'Do you have any other comments, questions, or concerns?', 'sequence': 9, 'question_type': 'text_box', 'constr_mandatory': False, }) ], }) def test_01_admin_survey_tour(self): access_token = self.survey_feedback.access_token self.start_tour("/survey/start/%s" % access_token, 'test_survey', login="admin") def test_02_demo_survey_tour(self): access_token = self.survey_feedback.access_token self.start_tour("/survey/start/%s" % access_token, 'test_survey', login="demo") def test_03_public_survey_tour(self): access_token = self.survey_feedback.access_token self.start_tour("/survey/start/%s" % access_token, 'test_survey') def test_04_public_survey_with_triggers(self): """ Check that chained conditional questions are correctly hidden from survey when a previously selected triggering answer is unselected. E.g., if a specific answer for "Question 1" is selected, which triggers asking "Question 2", and a specific answer for "Question 2" is selected and triggers asking "Question 3", changing the selected answer for "Question 1" should: * hide questions 2 and 3 * enable submitting the survey without answering questions 2 and 3, even if "constr_mandatory=True", as they are not visible. """ survey_with_triggers = self.env['survey.survey'].create({ 'title': 'Survey With Triggers', 'access_token': '3cfadce3-3f7e-41da-920d-10fa0eb19527', 'access_mode': 'public', 'users_can_go_back': True, 'questions_layout': 'one_page', 'description': "

Test survey with conditional questions

", 'question_and_page_ids': [ (0, 0, { 'title': 'Q1', 'sequence': 1, 'question_type': 'simple_choice', 'suggested_answer_ids': [ Command.create({'value': 'Answer 1'}), Command.create({'value': 'Answer 2'}), Command.create({'value': 'Answer 3'}), ], 'constr_mandatory': True, }), Command.create({ 'title': 'Q2', 'sequence': 2, 'question_type': 'simple_choice', 'suggested_answer_ids': [ Command.create({'value': 'Answer 1'}), Command.create({'value': 'Answer 2'}), ], 'constr_mandatory': True, }), Command.create({ 'title': 'Q3', 'sequence': 3, 'question_type': 'simple_choice', 'suggested_answer_ids': [ Command.create({'value': 'Answer 1'}), Command.create({'value': 'Answer 2'}), ], 'constr_mandatory': True, }), Command.create({ 'title': 'Q4', 'sequence': 4, 'question_type': 'numerical_box', 'constr_mandatory': True, }) ] }) q1, q2, q3, q4 = survey_with_triggers.question_and_page_ids q1_a1, __, q1_a3 = q1.suggested_answer_ids q2_a1 = q2.suggested_answer_ids[0] q2.triggering_answer_ids = q1_a1 q3.triggering_answer_ids = q1_a3 | q2_a1 q4.triggering_answer_ids = q1_a1 access_token = survey_with_triggers.access_token self.start_tour("/survey/start/%s" % access_token, 'test_survey_chained_conditional_questions') def test_05_public_survey_with_trigger_on_different_page(self): """Check that conditional questions are shown when triggered from a different page too.""" survey_with_trigger_on_different_page = self.env['survey.survey'].create({ 'title': 'Survey With Trigger on a different page', 'access_token': '1cb935bd-2399-4ed1-9e10-c649318fb4dc', 'access_mode': 'public', 'users_can_go_back': True, 'questions_layout': 'page_per_section', 'description': "

Test survey with conditional questions triggered from a previous section

", 'question_and_page_ids': [ Command.create({ 'title': 'Section 1', 'is_page': True, 'sequence': 1, 'question_type': False, }), Command.create({ 'title': 'Q1', 'sequence': 2, 'question_type': 'simple_choice', 'suggested_answer_ids': [ Command.create({'value': 'Answer 1'}), Command.create({'value': 'Answer 2'}), Command.create({'value': 'Answer 3'}), ], 'constr_mandatory': False, }), Command.create({ 'title': 'Section 2', 'is_page': True, 'sequence': 3, 'question_type': False, }), Command.create({ 'title': 'Q2', 'sequence': 4, 'question_type': 'simple_choice', 'suggested_answer_ids': [ Command.create({'value': 'Answer 1'}), Command.create({'value': 'Answer 2'}), ], 'constr_mandatory': False, }), Command.create({ 'title': 'Q3', 'sequence': 3, 'question_type': 'numerical_box', 'constr_mandatory': False, }), ] }) q1 = survey_with_trigger_on_different_page.question_ids.filtered(lambda q: q.title == 'Q1') q1_a1 = q1.suggested_answer_ids.filtered(lambda a: a.value == 'Answer 1') q2 = survey_with_trigger_on_different_page.question_ids.filtered(lambda q: q.title == 'Q2') q2_a1 = q2.suggested_answer_ids.filtered(lambda a: a.value == 'Answer 1') q3 = survey_with_trigger_on_different_page.question_ids.filtered(lambda q: q.title == 'Q3') q3.triggering_answer_ids = q1_a1 | q2_a1 access_token = survey_with_trigger_on_different_page.access_token self.start_tour("/survey/start/%s" % access_token, 'test_survey_conditional_question_on_different_page') def test_06_survey_prefill(self): access_token = self.survey_feedback.access_token self.start_tour("/survey/start/%s" % access_token, 'test_survey_prefill') def test_07_survey_roaming_mandatory_questions(self): survey_with_mandatory_questions = self.env['survey.survey'].create({ 'title': 'Survey With Mandatory questions', 'access_token': '853ebb30-40f2-43bf-a95a-bbf0e367a365', 'access_mode': 'public', 'users_can_go_back': True, 'questions_layout': 'page_per_question', 'description': "

Test survey with roaming freely option and mandatory questions

", 'question_and_page_ids': [ Command.create({ 'title': 'Q1', 'sequence': 1, 'question_type': 'simple_choice', 'constr_mandatory': True, 'suggested_answer_ids': [ Command.create({'value': 'Answer 1'}), Command.create({'value': 'Answer 2'}), Command.create({'value': 'Answer 3'}), ], }), Command.create({ 'title': 'Q2', 'sequence': 2, 'question_type': 'simple_choice', 'constr_mandatory': True, 'suggested_answer_ids': [ Command.create({'value': 'Answer 1'}), Command.create({'value': 'Answer 2'}), Command.create({'value': 'Answer 3'}), ], }), Command.create({ 'title': 'Q3', 'sequence': 3, 'question_type': 'simple_choice', 'constr_mandatory': True, 'suggested_answer_ids': [ Command.create({'value': 'Answer 1'}), Command.create({'value': 'Answer 2'}), ], }), ] }) access_token = survey_with_mandatory_questions.access_token self.start_tour("/survey/start/%s" % access_token, 'test_survey_roaming_mandatory_questions')