diff options
| author | Thibault Delavallée <tde@odoo.com> | 2018-12-04 16:00:12 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2019-01-14 15:22:18 +0000 |
| commit | 6fa46886931b29e4e7130c04d133657f3dffd6e3 (patch) | |
| tree | 610b1143d159697b5a008c539e636a5919af6a62 /addons/survey/tests | |
| parent | 1c5371a966632eef2b6eaf67b755d13f529e7988 (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.py | 161 |
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) |
