summaryrefslogtreecommitdiff
path: root/addons/survey/tests
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2018-12-04 16:00:12 +0000
committerThibault Delavallée <tde@odoo.com>2019-01-14 15:22:18 +0000
commit6fa46886931b29e4e7130c04d133657f3dffd6e3 (patch)
tree610b1143d159697b5a008c539e636a5919af6a62 /addons/survey/tests
parent1c5371a966632eef2b6eaf67b755d13f529e7988 (diff)
[REF] survey: refactor invitation wizard
Purpose is to clean and simplify invite wizard on surveys. Main purpose is to simplify options. Public link is displayed for public surveys, allowing to quickly share it. When sending emails a token is now generated for each recipient. There is no "batch public link" sending option anymore as it is not really necessary. Check is done on recipients and emails to match the access mode option. Having a restricted survey gives the same limitations on people to invite (users, employees, ...). Code is cleaned to ease its understanding and prepare future evolution notably with appraisals. An existing mode field is added on invite model. All options are currently not used but it prepares future addition to survey, notably for certifications. Its purpose is to know what to do with existing tokens when inviting new recipients. It is used notably to resend tokens through the user_input form view instead of relying on a custom context key. This commit is linked to task ID 1911586 and PR #28986.
Diffstat (limited to 'addons/survey/tests')
-rw-r--r--addons/survey/tests/test_survey_invite.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/addons/survey/tests/test_survey_invite.py b/addons/survey/tests/test_survey_invite.py
index b2f464dcf98..92c74bc89a8 100644
--- a/addons/survey/tests/test_survey_invite.py
+++ b/addons/survey/tests/test_survey_invite.py
@@ -1,13 +1,24 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from datetime import datetime
+from dateutil.relativedelta import relativedelta
+
+from odoo import fields
from odoo.addons.survey.tests import common
from odoo.exceptions import UserError
+from odoo.tests import Form
from odoo.tests.common import users
class TestSurveyInvite(common.SurveyCase):
+ def setUp(self):
+ res = super(TestSurveyInvite, self).setUp()
+ # by default signup not allowed
+ self.env["ir.config_parameter"].set_param('auth_signup.invitation_scope', 'b2b')
+ return res
+
@users('survey_manager')
def test_survey_invite_action(self):
# Check correctly configured survey returns an invite wizard action
@@ -30,3 +41,153 @@ class TestSurveyInvite(common.SurveyCase):
for survey in surveys:
with self.assertRaises(UserError):
survey.action_send_survey()
+
+ @users('survey_manager')
+ def test_survey_invite(self):
+ Answer = self.env['survey.user_input']
+ deadline = fields.Datetime.now() + relativedelta(months=1)
+
+ self.survey.write({'access_mode': 'public'})
+ action = self.survey.action_send_survey()
+ invite_form = Form(self.env[action['res_model']].with_context(action['context']))
+
+ # some lowlevel checks that action is correctly configured
+ self.assertEqual(Answer.search([('survey_id', '=', self.survey.id)]), self.env['survey.user_input'])
+ self.assertEqual(invite_form.survey_id, self.survey)
+
+ invite_form.partner_ids.add(self.customer)
+ invite_form.deadline = fields.Datetime.to_string(deadline)
+
+ invite = invite_form.save()
+ invite.action_invite()
+
+ answers = Answer.search([('survey_id', '=', self.survey.id)])
+ self.assertEqual(len(answers), 1)
+ self.assertEqual(
+ set(answers.mapped('email')),
+ set([self.customer.email]))
+ self.assertEqual(answers.mapped('partner_id'), self.customer)
+ self.assertEqual(set(answers.mapped('deadline')), set([deadline]))
+
+ @users('survey_manager')
+ def test_survey_invite_authentication_nosignup(self):
+ Answer = self.env['survey.user_input']
+
+ self.survey.write({'access_mode': 'authentication'})
+ action = self.survey.action_send_survey()
+ invite_form = Form(self.env[action['res_model']].with_context(action['context']))
+
+ with self.assertRaises(UserError): # do not allow to add customer (partner without user)
+ invite_form.partner_ids.add(self.customer)
+ invite_form.partner_ids.clear()
+ invite_form.partner_ids.add(self.user_portal.partner_id)
+ invite_form.partner_ids.add(self.user_emp.partner_id)
+ with self.assertRaises(UserError):
+ invite_form.emails = 'test1@example.com, Raoulette Vignolette <test2@example.com>'
+ invite_form.emails = False
+
+ invite = invite_form.save()
+ invite.action_invite()
+
+ answers = Answer.search([('survey_id', '=', self.survey.id)])
+ self.assertEqual(len(answers), 2)
+ self.assertEqual(
+ set(answers.mapped('email')),
+ set([self.user_emp.email, self.user_portal.email]))
+ self.assertEqual(answers.mapped('partner_id'), self.user_emp.partner_id | self.user_portal.partner_id)
+
+ @users('survey_manager')
+ def test_survey_invite_authentication_signup(self):
+ self.env["ir.config_parameter"].sudo().set_param('auth_signup.invitation_scope', 'b2c')
+ self.survey.invalidate_cache()
+ Answer = self.env['survey.user_input']
+
+ self.survey.write({'access_mode': 'authentication'})
+ action = self.survey.action_send_survey()
+ invite_form = Form(self.env[action['res_model']].with_context(action['context']))
+
+ invite_form.partner_ids.add(self.customer)
+ invite_form.partner_ids.add(self.user_portal.partner_id)
+ invite_form.partner_ids.add(self.user_emp.partner_id)
+ # TDE FIXME: not sure for emails in authentication + signup
+ # invite_form.emails = 'test1@example.com, Raoulette Vignolette <test2@example.com>'
+
+ invite = invite_form.save()
+ invite.action_invite()
+
+ answers = Answer.search([('survey_id', '=', self.survey.id)])
+ self.assertEqual(len(answers), 3)
+ self.assertEqual(
+ set(answers.mapped('email')),
+ set([self.customer.email, self.user_emp.email, self.user_portal.email]))
+ self.assertEqual(answers.mapped('partner_id'), self.customer | self.user_emp.partner_id | self.user_portal.partner_id)
+
+ @users('survey_manager')
+ def test_survey_invite_internal(self):
+ Answer = self.env['survey.user_input']
+
+ self.survey.write({'access_mode': 'internal'})
+ action = self.survey.action_send_survey()
+ invite_form = Form(self.env[action['res_model']].with_context(action['context']))
+
+ with self.assertRaises(UserError): # do not allow to add customer (partner without user)
+ invite_form.partner_ids.add(self.customer)
+ with self.assertRaises(UserError): # do not allow to add portal user
+ invite_form.partner_ids.add(self.user_portal.partner_id)
+ invite_form.partner_ids.clear()
+ invite_form.partner_ids.add(self.user_emp.partner_id)
+ with self.assertRaises(UserError):
+ invite_form.emails = 'test1@example.com, Raoulette Vignolette <test2@example.com>'
+ invite_form.emails = False
+
+ invite = invite_form.save()
+ invite.action_invite()
+
+ answers = Answer.search([('survey_id', '=', self.survey.id)])
+ self.assertEqual(len(answers), 1)
+ self.assertEqual(
+ set(answers.mapped('email')),
+ set([self.user_emp.email]))
+ self.assertEqual(answers.mapped('partner_id'), self.user_emp.partner_id)
+
+ @users('survey_manager')
+ def test_survey_invite_public(self):
+ Answer = self.env['survey.user_input']
+
+ self.survey.write({'access_mode': 'public'})
+ action = self.survey.action_send_survey()
+ invite_form = Form(self.env[action['res_model']].with_context(action['context']))
+
+ invite_form.partner_ids.add(self.customer)
+ invite_form.emails = 'test1@example.com, Raoulette Vignolette <test2@example.com>'
+
+ invite = invite_form.save()
+ invite.action_invite()
+
+ answers = Answer.search([('survey_id', '=', self.survey.id)])
+ self.assertEqual(len(answers), 3)
+ self.assertEqual(
+ set(answers.mapped('email')),
+ set(['test1@example.com', 'Raoulette Vignolette <test2@example.com>', self.customer.email]))
+ self.assertEqual(answers.mapped('partner_id'), self.customer)
+
+ @users('survey_manager')
+ def test_survey_invite_token(self):
+ Answer = self.env['survey.user_input']
+
+ self.survey.write({'access_mode': 'token'})
+ action = self.survey.action_send_survey()
+ invite_form = Form(self.env[action['res_model']].with_context(action['context']))
+
+ invite_form.partner_ids.add(self.customer)
+ invite_form.emails = 'test1@example.com, Raoulette Vignolette <test2@example.com>'
+
+ invite = invite_form.save()
+ invite.action_invite()
+
+ answers = Answer.search([('survey_id', '=', self.survey.id)])
+ self.assertEqual(len(answers), 3)
+ self.assertEqual(
+ set(answers.mapped('email')),
+ set(['test1@example.com', 'Raoulette Vignolette <test2@example.com>', self.customer.email]))
+ self.assertEqual(answers.mapped('partner_id'), self.customer)