summaryrefslogtreecommitdiff
path: root/addons/survey/tests
diff options
context:
space:
mode:
authorAurélien Warnon <awa@odoo.com>2019-02-06 09:37:59 +0000
committerAurélien Warnon <awa@odoo.com>2019-02-06 09:37:59 +0000
commitdba478332681dd21a39c4a183c002b1cf6e046d2 (patch)
tree81b302664d0af480965d66ecfdb279684113a90a /addons/survey/tests
parenteacaf02544fe3b2c51e48234bffcf86aff6841f1 (diff)
[REF] survey: convert survey.page to survey.question -> is_page=True
Task #1902306 Purpose ======= survey.question is now also the model used for the survey's pages (with the "is_page" field set to True). This allows to put all the pages and questions together in a o2m field on the view side and easily reorganize your survey by dragging the items around. It also removes one level of encoding by directly having 'Add a page' and 'Add a question' links on the tree view of questions, enabling a faster encoding. However, this has the downside of making the code reading a little bit more complicated. Efforts were made at the model level to create computed fields so that the use of these models still seems somewhat logical. That means: - A survey still has "page_ids" (question_and_page_ids filtered on is_page = True) - These "page_ids" still have question_ids (questions located between this page and the next) - These "question_ids" still have a "page_id" That makes the use and display of these information at view and controller levels easier to understand.
Diffstat (limited to 'addons/survey/tests')
-rw-r--r--addons/survey/tests/__init__.py1
-rw-r--r--addons/survey/tests/common.py19
-rw-r--r--addons/survey/tests/test_survey_compute_pages_questions.py69
-rw-r--r--addons/survey/tests/test_survey_flow.py18
-rw-r--r--addons/survey/tests/test_survey_invite.py9
-rw-r--r--addons/survey/tests/test_survey_security.py28
6 files changed, 113 insertions, 31 deletions
diff --git a/addons/survey/tests/__init__.py b/addons/survey/tests/__init__.py
index 0f0a3bd31ca..bc51dec7bcf 100644
--- a/addons/survey/tests/__init__.py
+++ b/addons/survey/tests/__init__.py
@@ -7,3 +7,4 @@ from . import test_survey_flow
from . import test_survey_invite
from . import test_survey_security
from . import test_survey_ui
+from . import test_survey_compute_pages_questions
diff --git a/addons/survey/tests/common.py b/addons/survey/tests/common.py
index f5be81b7f0e..a37b7cd6b91 100644
--- a/addons/survey/tests/common.py
+++ b/addons/survey/tests/common.py
@@ -67,19 +67,24 @@ class SurveyCase(common.SavepointCase):
'access_mode': 'public',
'users_login_required': True,
'users_can_go_back': False,
+ 'stage_id': self.env['survey.stage'].search([('closed', '=', False)]).id,
})
- self.page_0 = self.env['survey.page'].sudo(self.survey_manager).create({
+ self.page_0 = self.env['survey.question'].sudo(self.survey_manager).create({
'title': 'First page',
'survey_id': self.survey.id,
+ 'sequence': 1,
+ 'is_page': True,
})
self.question_ft = self.env['survey.question'].sudo(self.survey_manager).create({
- 'question': 'Test Free Text',
- 'page_id': self.page_0.id,
+ 'title': 'Test Free Text',
+ 'survey_id': self.survey.id,
+ 'sequence': 2,
'question_type': 'free_text',
})
self.question_num = self.env['survey.question'].sudo(self.survey_manager).create({
- 'question': 'Test NUmerical Box',
- 'page_id': self.page_0.id,
+ 'title': 'Test NUmerical Box',
+ 'survey_id': self.survey.id,
+ 'sequence': 3,
'question_type': 'numerical_box',
})
@@ -143,8 +148,8 @@ class SurveyCase(common.SavepointCase):
constr_mandatory = kwargs.pop('constr_mandatory', True)
constr_error_msg = kwargs.pop('constr_error_msg', 'TestError')
base_qvalues = {
- 'page_id': page.id,
- 'question': name,
+ 'sequence': page.question_ids[-1].sequence + 1 if page.question_ids else page.sequence + 1,
+ 'title': name,
'question_type': qtype,
'constr_mandatory': constr_mandatory,
'constr_error_msg': constr_error_msg,
diff --git a/addons/survey/tests/test_survey_compute_pages_questions.py b/addons/survey/tests/test_survey_compute_pages_questions.py
new file mode 100644
index 00000000000..3b48fb509f3
--- /dev/null
+++ b/addons/survey/tests/test_survey_compute_pages_questions.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.addons.survey.tests import common
+
+
+class TestSurveyComputePagesQuestions(common.SurveyCase):
+ def test_compute_pages_questions(self):
+ with self.sudo(self.survey_manager):
+ survey = self.env['survey.survey'].create({
+ 'title': 'Test compute survey',
+ 'stage_id': self.env['survey.stage'].search([('closed', '=', False)]).id
+ })
+
+ page_0 = self.env['survey.question'].create({
+ 'is_page': True,
+ 'sequence': 1,
+ 'title': 'P1',
+ 'survey_id': survey.id
+ })
+ page0_q0 = self._add_question(page_0, 'Q1', 'free_text', survey_id=survey.id)
+ page0_q1 = self._add_question(page_0, 'Q2', 'free_text', survey_id=survey.id)
+ page0_q2 = self._add_question(page_0, 'Q3', 'free_text', survey_id=survey.id)
+ page0_q3 = self._add_question(page_0, 'Q4', 'free_text', survey_id=survey.id)
+ page0_q4 = self._add_question(page_0, 'Q5', 'free_text', survey_id=survey.id)
+
+ page_1 = self.env['survey.question'].create({
+ 'is_page': True,
+ 'sequence': 7,
+ 'title': 'P2',
+ 'survey_id': survey.id,
+ })
+ page1_q0 = self._add_question(page_1, 'Q6', 'free_text', survey_id=survey.id)
+ page1_q1 = self._add_question(page_1, 'Q7', 'free_text', survey_id=survey.id)
+ page1_q2 = self._add_question(page_1, 'Q8', 'free_text', survey_id=survey.id)
+ page1_q3 = self._add_question(page_1, 'Q9', 'free_text', survey_id=survey.id)
+
+ self.assertEqual(len(survey.page_ids), 2, "Survey should have 2 pages")
+ self.assertIn(page_0, survey.page_ids, "Page 1 should be contained in survey's page_ids")
+ self.assertIn(page_1, survey.page_ids, "Page 2 should be contained in survey's page_ids")
+
+ self.assertEqual(len(page_0.question_ids), 5, "Page 1 should have 5 questions")
+ self.assertIn(page0_q0, page_0.question_ids, "Question 1 should be in page 1")
+ self.assertIn(page0_q1, page_0.question_ids, "Question 2 should be in page 1")
+ self.assertIn(page0_q2, page_0.question_ids, "Question 3 should be in page 1")
+ self.assertIn(page0_q3, page_0.question_ids, "Question 4 should be in page 1")
+ self.assertIn(page0_q4, page_0.question_ids, "Question 5 should be in page 1")
+
+ self.assertEqual(len(page_1.question_ids), 4, "Page 2 should have 4 questions")
+ self.assertIn(page1_q0, page_1.question_ids, "Question 6 should be in page 2")
+ self.assertIn(page1_q1, page_1.question_ids, "Question 7 should be in page 2")
+ self.assertIn(page1_q2, page_1.question_ids, "Question 8 should be in page 2")
+ self.assertIn(page1_q3, page_1.question_ids, "Question 9 should be in page 2")
+
+ self.assertEqual(page0_q0.page_id, page_0, "Question 1 should belong to page 1")
+ self.assertEqual(page0_q1.page_id, page_0, "Question 2 should belong to page 1")
+ self.assertEqual(page0_q2.page_id, page_0, "Question 3 should belong to page 1")
+ self.assertEqual(page0_q3.page_id, page_0, "Question 4 should belong to page 1")
+ self.assertEqual(page0_q4.page_id, page_0, "Question 5 should belong to page 1")
+
+ self.assertEqual(page1_q0.page_id, page_1, "Question 6 should belong to page 2")
+ self.assertEqual(page1_q1.page_id, page_1, "Question 7 should belong to page 2")
+ self.assertEqual(page1_q2.page_id, page_1, "Question 8 should belong to page 2")
+ self.assertEqual(page1_q3.page_id, page_1, "Question 9 should belong to page 2")
+
+ # move 1 question from page 1 to page 2
+ page0_q2.write({'sequence': 12})
+ page0_q2._compute_page_id()
+ self.assertEqual(page0_q2.page_id, page_1, "Question 3 should now belong to page 2")
diff --git a/addons/survey/tests/test_survey_flow.py b/addons/survey/tests/test_survey_flow.py
index 85c36621816..f83352800da 100644
--- a/addons/survey/tests/test_survey_flow.py
+++ b/addons/survey/tests/test_survey_flow.py
@@ -52,21 +52,25 @@ class TestSurveyFlow(common.SurveyCase, HttpCase):
})
# First page is about customer data
- page_0 = self.env['survey.page'].create({
+ page_0 = self.env['survey.question'].create({
+ 'is_page': True,
+ 'sequence': 1,
'title': 'Page1: Your Data',
'survey_id': survey.id,
})
page0_q0 = self._add_question(
page_0, 'What is your name', 'free_text',
comments_allowed=False,
- constr_mandatory=True, constr_error_msg='Please enter your name')
+ constr_mandatory=True, constr_error_msg='Please enter your name', survey_id=survey.id)
page0_q1 = self._add_question(
page_0, 'What is your age', 'numerical_box',
comments_allowed=False,
- constr_mandatory=True, constr_error_msg='Please enter your name')
+ constr_mandatory=True, constr_error_msg='Please enter your name', survey_id=survey.id)
# Second page is about tarte al djotte
- page_1 = self.env['survey.page'].create({
+ page_1 = self.env['survey.question'].create({
+ 'is_page': True,
+ 'sequence': 4,
'title': 'Page2: Tarte Al Djotte',
'survey_id': survey.id,
})
@@ -75,7 +79,7 @@ class TestSurveyFlow(common.SurveyCase, HttpCase):
labels=[{'value': 'The gras'},
{'value': 'The bette'},
{'value': 'The tout'},
- {'value': 'The regime is fucked up'}])
+ {'value': 'The regime is fucked up'}], survey_id=survey.id)
# fetch starting data to check only newly created data during this flow
answers = self.env['survey.user_input'].search([('survey_id', '=', survey.id)])
@@ -95,12 +99,12 @@ class TestSurveyFlow(common.SurveyCase, HttpCase):
self.assertEqual(len(answers), 1)
answer_token = answers.token
self.assertTrue(answer_token)
- self.assertAnswer(answers, 'new', self.env['survey.page'])
+ self.assertAnswer(answers, 'new', self.env['survey.question'])
# Customer begins survey with first page
r = self._access_page(survey, answer_token)
self.assertResponse(r, 200)
- self.assertAnswer(answers, 'new', self.env['survey.page'])
+ self.assertAnswer(answers, 'new', self.env['survey.question'])
csrf_token = self._find_csrf_token(r.text)
# Customer submit first page answers
diff --git a/addons/survey/tests/test_survey_invite.py b/addons/survey/tests/test_survey_invite.py
index 3b977d0221d..5b530c15734 100644
--- a/addons/survey/tests/test_survey_invite.py
+++ b/addons/survey/tests/test_survey_invite.py
@@ -30,12 +30,15 @@ class TestSurveyInvite(common.SurveyCase):
# no page
self.env['survey.survey'].create({'title': 'Test survey'}),
# no questions
- self.env['survey.survey'].create({'title': 'Test survey', 'page_ids': [(0, 0, {'title': 'P0'})]}),
+ self.env['survey.survey'].create({'title': 'Test survey', 'question_and_page_ids': [(0, 0, {'is_page': True, 'title': 'P0', 'sequence': 1})]}),
# closed
self.env['survey.survey'].sudo(self.survey_manager).create({
'title': 'S0',
- 'stage_id': self.env['survey.stage'].search([('closed', '=', True)]).id,
- 'page_ids': [(0, 0, {'title': 'P0', 'question_ids': [(0, 0, {'question': 'Q0', 'question_type': 'free_text'})]})]
+ 'stage_id': self.env['survey.stage'].search([('sequence', '=', 3)]).id,
+ 'question_and_page_ids': [
+ (0, 0, {'is_page': True, 'title': 'P0', 'sequence': 1}),
+ (0, 0, {'title': 'Q0', 'sequence': 2, 'question_type': 'free_text'})
+ ]
})
]
for survey in surveys:
diff --git a/addons/survey/tests/test_survey_security.py b/addons/survey/tests/test_survey_security.py
index 7ac3db41382..b2473029f7a 100644
--- a/addons/survey/tests/test_survey_security.py
+++ b/addons/survey/tests/test_survey_security.py
@@ -25,9 +25,9 @@ class TestAccess(common.SurveyCase):
with self.assertRaises(AccessError):
self.env['survey.survey'].create({'title': 'Test Survey 2'})
with self.assertRaises(AccessError):
- self.env['survey.page'].create({'title': 'My Page', 'survey_id': self.survey.id})
+ self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': self.survey.id})
with self.assertRaises(AccessError):
- self.env['survey.question'].create({'question': 'My Question', 'page_id': self.page_0.id})
+ self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'page_id': self.page_0.id})
# Read: nope
with self.assertRaises(AccessError):
@@ -58,9 +58,9 @@ class TestAccess(common.SurveyCase):
with self.assertRaises(AccessError):
self.env['survey.survey'].create({'title': 'Test Survey 2'})
with self.assertRaises(AccessError):
- self.env['survey.page'].create({'title': 'My Page', 'survey_id': self.survey.id})
+ self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': self.survey.id})
with self.assertRaises(AccessError):
- self.env['survey.question'].create({'question': 'My Question', 'page_id': self.page_0.id})
+ self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'page_id': self.page_0.id})
# Read: nope
with self.assertRaises(AccessError):
@@ -91,9 +91,9 @@ class TestAccess(common.SurveyCase):
with self.assertRaises(AccessError):
self.env['survey.survey'].create({'title': 'Test Survey 2'})
with self.assertRaises(AccessError):
- self.env['survey.page'].create({'title': 'My Page', 'survey_id': self.survey.id})
+ self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': self.survey.id})
with self.assertRaises(AccessError):
- self.env['survey.question'].create({'question': 'My Question', 'page_id': self.page_0.id})
+ self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'page_id': self.page_0.id})
# Read: nope
with self.assertRaises(AccessError):
@@ -121,8 +121,8 @@ class TestAccess(common.SurveyCase):
def test_access_survey_survey_manager(self):
# Create: all
survey = self.env['survey.survey'].create({'title': 'Test Survey 2'})
- page = self.env['survey.page'].create({'title': 'My Page', 'survey_id': survey.id})
- self.env['survey.question'].create({'question': 'My Question', 'page_id': page.id})
+ self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': survey.id})
+ self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'survey_id': survey.id})
# Read: all
surveys = self.env['survey.survey'].search([('title', 'ilike', 'Test')])
@@ -140,8 +140,8 @@ class TestAccess(common.SurveyCase):
def test_access_survey_survey_user(self):
# Create: own only
survey = self.env['survey.survey'].create({'title': 'Test Survey 2'})
- page = self.env['survey.page'].create({'title': 'My Page', 'survey_id': survey.id})
- self.env['survey.question'].create({'question': 'My Question', 'page_id': page.id})
+ self.env['survey.question'].create({'title': 'My Page', 'sequence': 0, 'is_page': True, 'survey_id': survey.id})
+ self.env['survey.question'].create({'title': 'My Question', 'sequence': 1, 'survey_id': survey.id})
# Read: all
surveys = self.env['survey.survey'].search([('title', 'ilike', 'Test')])
@@ -249,8 +249,8 @@ class TestAccess(common.SurveyCase):
@users('survey_user')
def test_access_answers_survey_user(self):
survey_own = self.env['survey.survey'].create({'title': 'Other'})
- page_own = self.env['survey.page'].create({'title': 'Other', 'survey_id': survey_own.id})
- question_own = self.env['survey.question'].create({'question': 'Other Question', 'page_id': page_own.id})
+ self.env['survey.question'].create({'title': 'Other', 'sequence': 0, 'is_page': True, 'survey_id': survey_own.id})
+ question_own = self.env['survey.question'].create({'title': 'Other Question', 'sequence': 1, 'survey_id': survey_own.id})
# Create: own survey only
answer_own = self.env['survey.user_input'].create({'survey_id': survey_own.id})
@@ -293,8 +293,8 @@ class TestAccess(common.SurveyCase):
admin = self.env.ref('base.user_admin')
with self.sudo(admin):
survey_other = self.env['survey.survey'].create({'title': 'Other'})
- page_other = self.env['survey.page'].create({'title': 'Other', 'survey_id': survey_other.id})
- question_other = self.env['survey.question'].create({'question': 'Other Question', 'page_id': page_other.id})
+ self.env['survey.question'].create({'title': 'Other', 'sequence': 0, 'is_page': True, 'survey_id': survey_other.id})
+ question_other = self.env['survey.question'].create({'title': 'Other Question', 'sequence': 1, 'survey_id': survey_other.id})
self.assertEqual(survey_other.create_uid, admin)
self.assertEqual(question_other.create_uid, admin)