summaryrefslogtreecommitdiff
path: root/addons/test_event_full
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/test_event_full
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/test_event_full')
-rw-r--r--addons/test_event_full/__init__.py2
-rw-r--r--addons/test_event_full/__manifest__.py34
-rw-r--r--addons/test_event_full/static/src/js/tours/wevent_register_tour.js165
-rw-r--r--addons/test_event_full/tests/__init__.py6
-rw-r--r--addons/test_event_full/tests/common.py280
-rw-r--r--addons/test_event_full/tests/test_event_crm.py149
-rw-r--r--addons/test_event_full/tests/test_wevent_register.py44
-rw-r--r--addons/test_event_full/views/assets.xml8
8 files changed, 688 insertions, 0 deletions
diff --git a/addons/test_event_full/__init__.py b/addons/test_event_full/__init__.py
new file mode 100644
index 00000000..67dee8c6
--- /dev/null
+++ b/addons/test_event_full/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
diff --git a/addons/test_event_full/__manifest__.py b/addons/test_event_full/__manifest__.py
new file mode 100644
index 00000000..71a7cd05
--- /dev/null
+++ b/addons/test_event_full/__manifest__.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+{
+ 'name': 'Test Full Event Flow',
+ 'version': '1.0',
+ 'category': 'Hidden/Tests',
+ 'description': """
+This module will test the main event flows of Odoo, both frontend and backend.
+It installs sale capabilities, front-end flow, eCommerce, questions and
+automatic lead generation, full Online support, ...
+""",
+ 'depends': [
+ 'event',
+ 'event_crm',
+ 'event_sale',
+ 'website_event_crm_questions',
+ 'website_event_questions',
+ 'website_event_questions',
+ 'website_event_meet',
+ 'website_event_sale',
+ 'website_event_track',
+ 'website_event_track_exhibitor',
+ 'website_event_track_live',
+ 'website_event_track_quiz',
+ ],
+ 'data': [
+ 'views/assets.xml',
+ ],
+ 'demo': [
+ ],
+ 'installable': True,
+ 'license': 'LGPL-3',
+}
diff --git a/addons/test_event_full/static/src/js/tours/wevent_register_tour.js b/addons/test_event_full/static/src/js/tours/wevent_register_tour.js
new file mode 100644
index 00000000..782b3fea
--- /dev/null
+++ b/addons/test_event_full/static/src/js/tours/wevent_register_tour.js
@@ -0,0 +1,165 @@
+odoo.define('test_event_full.tour.register', function (require) {
+"use strict";
+
+var tour = require('web_tour.tour');
+
+/**
+ * TALKS STEPS
+ */
+
+var discoverTalkSteps = function (talkName, fromList, reminderOn, toggleReminder) {
+ var steps;
+ if (fromList) {
+ steps = [{
+ content: 'Go on "' + talkName + '" talk in List',
+ trigger: 'a:contains("' + talkName + '")',
+ }];
+ }
+ else {
+ steps = [{
+ content: 'Click on Live Track',
+ trigger: 'article span:contains("' + talkName + '")',
+ run: 'click',
+ }];
+ }
+ if (reminderOn) {
+ steps = steps.concat([{
+ content: "Check Favorite is on",
+ trigger: 'div.o_wetrack_js_reminder i.fa-bell',
+ extra_trigger: 'span.o_wetrack_js_reminder_text:contains("Favorite On")',
+ run: function () {}, // it's a check
+ }]);
+ }
+ else {
+ steps = steps.concat([{
+ content: "Check Favorite is Off",
+ trigger: 'span.o_wetrack_js_reminder_text:contains("Set Favorite")',
+ run: function () {}, // it's a check
+ }]);
+ if (toggleReminder) {
+ steps = steps.concat([{
+ content: "Set Favorite",
+ trigger: 'span.o_wetrack_js_reminder_text',
+ run: 'click',
+ }, {
+ content: "Check Favorite is On",
+ trigger: 'div.o_wetrack_js_reminder i.fa-bell',
+ extra_trigger: 'span.o_wetrack_js_reminder_text:contains("Favorite On")',
+ run: function () {}, // it's a check
+ }]);
+ }
+ }
+ return steps;
+};
+
+
+/**
+ * ROOMS STEPS
+ */
+
+var discoverRoomSteps = function (roomName) {
+ var steps = [{
+ content: 'Go on "' + roomName + '" room in List',
+ trigger: 'a.o_wevent_meeting_room_card h4:contains("' + roomName + '")',
+ run: function() {
+ // can't click on it, it will try to launch Jitsi and fail on chrome headless
+ },
+ }];
+ return steps;
+};
+
+
+/**
+ * REGISTER STEPS
+ */
+
+var registerSteps = [{
+ content: 'Go on Register',
+ trigger: 'a.btn-primary:contains("Register")',
+}, {
+ content: "Select 2 units of 'Standard' ticket type",
+ trigger: '#o_wevent_tickets_collapse .row:has(.o_wevent_registration_multi_select:contains("Free")) select',
+ run: 'text 2',
+}, {
+ content: "Click on 'Register' button",
+ trigger: '#o_wevent_tickets .btn-primary:contains("Register"):not(:disabled)',
+ run: 'click',
+}, {
+ content: "Fill attendees details",
+ trigger: 'form[id="attendee_registration"] .btn:contains("Continue")',
+ run: function () {
+ $("input[name='1-name']").val("Raoulette Poiluchette");
+ $("input[name='1-phone']").val("0456112233");
+ $("input[name='1-email']").val("raoulette@example.com");
+ $("select[name*='question_answer-1']").val($("select[name*='question_answer-1'] option:contains('Consumers')").val());
+ $("input[name='2-name']").val("Michel Tractopelle");
+ $("input[name='2-phone']").val("0456332211");
+ $("input[name='2-email']").val("michel@example.com");
+ $("select[name*='question_answer-2']").val($("select[name*='question_answer-1'] option:contains('Research')").val());
+ $("textarea[name*='question_answer']").text("An unicorn told me about you. I ate it afterwards.");
+ },
+}, {
+ content: "Validate attendees details",
+ extra_trigger: "input[name='1-name'], input[name='2-name'], input[name='3-name']",
+ trigger: 'button:contains("Continue")',
+ run: 'click',
+}, {
+ trigger: 'div.o_wereg_confirmed_attendees span:contains("Raoulette Poiluchette")',
+ run: function () {} // check
+}, {
+ trigger: 'div.o_wereg_confirmed_attendees span:contains("Michel Tractopelle")',
+ run: function () {} // check
+}, {
+ content: "Click on 'register favorites talks' button",
+ trigger: 'a:contains("register to your favorites talks now")',
+ run: 'click',
+}, {
+ trigger: 'h1:contains("Book your talks")',
+ run: function() {},
+}];
+
+/**
+ * MAIN STEPS
+ */
+
+var initTourSteps = function (eventName) {
+ return [{
+ content: 'Go on "' + eventName + '" page',
+ trigger: 'a[href*="/event"]:contains("' + eventName + '"):first',
+ }];
+};
+
+var browseTalksSteps = [{
+ content: 'Browse Talks',
+ trigger: 'a:contains("Talks")',
+}];
+
+var browseExhibitorsSteps = [{
+ content: 'Browse Exhibitors',
+ trigger: 'a:contains("Exhibitors")',
+}];
+
+var browseMeetSteps = [{
+ content: 'Browse Meet',
+ trigger: 'a:contains("Community")',
+}];
+
+
+tour.register('wevent_register', {
+ url: '/event',
+ test: true
+}, [].concat(
+ initTourSteps('Online Reveal'),
+ browseTalksSteps,
+ discoverTalkSteps('What This Event Is All About', true, true),
+ browseTalksSteps,
+ discoverTalkSteps('Live Testimonial', false, false, false),
+ browseTalksSteps,
+ discoverTalkSteps('Our Last Day Together !', true, false, true),
+ browseMeetSteps,
+ discoverRoomSteps('Best wood for furniture'),
+ registerSteps,
+ )
+);
+
+});
diff --git a/addons/test_event_full/tests/__init__.py b/addons/test_event_full/tests/__init__.py
new file mode 100644
index 00000000..7011f22b
--- /dev/null
+++ b/addons/test_event_full/tests/__init__.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import common
+from . import test_event_crm
+from . import test_wevent_register
diff --git a/addons/test_event_full/tests/common.py b/addons/test_event_full/tests/common.py
new file mode 100644
index 00000000..c93396d8
--- /dev/null
+++ b/addons/test_event_full/tests/common.py
@@ -0,0 +1,280 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from datetime import datetime, timedelta, time
+
+from odoo.addons.base.tests.common import HttpCaseWithUserDemo, HttpCaseWithUserPortal
+from odoo.addons.event_crm.tests.common import TestEventCrmCommon
+from odoo.addons.sales_team.tests.common import TestSalesCommon
+from odoo.addons.website.tests.test_website_visitor import MockVisitor
+from odoo.addons.website_event.tests.common import EventDtPatcher
+
+
+class TestEventFullCommon(TestEventCrmCommon, TestSalesCommon, EventDtPatcher, MockVisitor):
+
+ @classmethod
+ def setUpClass(cls):
+ super(TestEventFullCommon, cls).setUpClass()
+
+ # ------------------------------------------------------------
+ # TICKET INFORMATIONS
+ # ------------------------------------------------------------
+
+ cls.event_product = cls.env['product.product'].create({
+ 'name': 'Test Registration Product',
+ 'description_sale': 'Mighty Description',
+ 'list_price': 10,
+ 'event_ok': True,
+ 'standard_price': 30.0,
+ 'type': 'service',
+ })
+
+ cls.website = cls.env['website'].search([
+ ('company_id', '=', cls.env.user.company_id.id)
+ ], limit=1)
+
+ cls.event_0.write({
+ # event if 8-18 in Europe/Brussels (DST) (first day: begins at 9, last day: ends at 15)
+ 'date_begin': datetime.combine(cls.reference_now, time(7, 0)) - timedelta(days=1),
+ 'date_end': datetime.combine(cls.reference_now, time(13, 0)) + timedelta(days=1),
+ # ticket informations
+ 'event_ticket_ids': [
+ (5, 0),
+ (0, 0, {
+ 'name': 'First Ticket',
+ 'product_id': cls.event_product.id,
+ 'seats_max': 30,
+ }), (0, 0, {
+ 'name': 'Second Ticket',
+ 'product_id': cls.event_product.id,
+ })
+ ],
+ })
+
+ # make a SO for a customer, selling some tickets
+ cls.customer_so = cls.env['sale.order'].with_user(cls.user_sales_salesman).create({
+ 'partner_id': cls.event_customer.id,
+ })
+
+ # ------------------------------------------------------------
+ # QUESTIONS
+ # ------------------------------------------------------------
+
+ cls.event_question_1 = cls.env['event.question'].create({
+ 'title': 'Question1',
+ 'question_type': 'simple_choice',
+ 'event_id': cls.event_0.id,
+ 'once_per_order': False,
+ 'answer_ids': [
+ (0, 0, {'name': 'Q1-Answer1'}),
+ (0, 0, {'name': 'Q1-Answer2'})
+ ],
+ })
+ cls.event_question_2 = cls.env['event.question'].create({
+ 'title': 'Question2',
+ 'question_type': 'simple_choice',
+ 'event_id': cls.event_0.id,
+ 'once_per_order': True,
+ 'answer_ids': [
+ (0, 0, {'name': 'Q2-Answer1'}),
+ (0, 0, {'name': 'Q2-Answer2'})
+ ],
+ })
+ cls.event_question_3 = cls.env['event.question'].create({
+ 'title': 'Question3',
+ 'question_type': 'text_box',
+ 'event_id': cls.event_0.id,
+ 'once_per_order': True,
+ })
+
+ # ------------------------------------------------------------
+ # DATA MARSHMALLING
+ # ------------------------------------------------------------
+
+ cls.website_customer_data = [{
+ 'name': 'My Customer %02d' % x,
+ 'partner_id': cls.env.ref('base.public_partner').id,
+ 'email': 'email.%02d@test.example.com' % x,
+ 'phone': '04560000%02d' % x,
+ 'registration_answer_ids': [
+ (0, 0, {
+ 'question_id': cls.event_question_1.id,
+ 'value_answer_id': cls.event_question_1.answer_ids[(x % 2)].id,
+ }), (0, 0, {
+ 'question_id': cls.event_question_2.id,
+ 'value_answer_id': cls.event_question_2.answer_ids[(x % 2)].id,
+ }), (0, 0, {
+ 'question_id': cls.event_question_3.id,
+ 'value_text_box': 'CustomerAnswer%s' % x,
+ })
+ ],
+ } for x in range(0, 4)]
+
+ def assertLeadConvertion(self, rule, registrations, partner=None, **expected):
+ super(TestEventFullCommon, self).assertLeadConvertion(rule, registrations, partner=partner, **expected)
+ lead = self.env['crm.lead'].sudo().search([
+ ('registration_ids', 'in', registrations.ids),
+ ('event_lead_rule_id', '=', rule.id)
+ ])
+
+ for registration in registrations:
+ if not registration.registration_answer_ids:
+ continue
+ for answer in registration.registration_answer_ids:
+ self.assertIn(answer.question_id.title, lead.description)
+ if answer.question_type == 'simple_choice':
+ self.assertIn(answer.value_answer_id.name, lead.description)
+ else:
+ self.assertIn(answer.value_text_box, lead.description) # better: check multi line
+
+
+class TestWEventCommon(HttpCaseWithUserDemo, HttpCaseWithUserPortal, EventDtPatcher, MockVisitor):
+
+ def setUp(self):
+ super(TestWEventCommon, self).setUp()
+
+ self.event_product = self.env['product.product'].create({
+ 'name': 'Test Event Registration',
+ 'default_code': 'EVENT_REG',
+ 'description_sale': 'Mighty Description',
+ 'list_price': 10,
+ 'event_ok': True,
+ 'standard_price': 30.0,
+ 'type': 'service',
+ })
+
+ self.event_tag_category_1 = self.env['event.tag.category'].create({
+ 'name': 'Type',
+ 'sequence': 2,
+ })
+ self.event_tag_category_1_tag_1 = self.env['event.tag'].create({
+ 'name': 'Online',
+ 'sequence': 10,
+ 'category_id': self.event_tag_category_1.id,
+ 'color': 8,
+ })
+ self.env['event.event'].search(
+ [('name', 'like', '%Online Reveal%')]
+ ).write(
+ {'name': 'Do not click on me'}
+ )
+ self.event = self.env['event.event'].create({
+ 'name': 'Online Reveal TestEvent',
+ 'auto_confirm': True,
+ 'stage_id': self.env.ref('event.event_stage_booked').id,
+ 'address_id': False,
+ 'user_id': self.user_demo.id,
+ 'tag_ids': [(4, self.event_tag_category_1_tag_1.id)],
+ # event if 8-18 in Europe/Brussels (DST) (first day: begins at 7, last day: ends at 17)
+ 'date_tz': 'Europe/Brussels',
+ 'date_begin': datetime.combine(self.reference_now, time(5, 0)) - timedelta(days=1),
+ 'date_end': datetime.combine(self.reference_now, time(15, 0)) + timedelta(days=1),
+ # ticket informations
+ 'event_ticket_ids': [
+ (0, 0, {
+ 'name': 'Standard',
+ 'product_id': self.event_product.id,
+ 'price': 0,
+ }), (0, 0, {
+ 'name': 'VIP',
+ 'product_id': self.event_product.id,
+ 'seats_max': 10,
+ })
+ ],
+ # activate menus
+ 'is_published': True,
+ 'website_menu': True,
+ 'website_track': True,
+ 'website_track_proposal': True,
+ 'exhibitor_menu': True,
+ 'community_menu': True,
+ })
+
+ self.event_customer = self.env['res.partner'].create({
+ 'name': 'Constantin Customer',
+ 'email': 'constantin@test.example.com',
+ 'country_id': self.env.ref('base.be').id,
+ 'phone': '0485112233',
+ 'mobile': False,
+ })
+ self.event_speaker = self.env['res.partner'].create({
+ 'name': 'Brandon Freeman',
+ 'email': 'brandon.freeman55@example.com',
+ 'phone': '(355)-687-3262',
+ })
+
+ # ------------------------------------------------------------
+ # QUESTIONS
+ # ------------------------------------------------------------
+
+ self.event_question_1 = self.env['event.question'].create({
+ 'title': 'Which field are you working in',
+ 'question_type': 'simple_choice',
+ 'event_id': self.event.id,
+ 'once_per_order': False,
+ 'answer_ids': [
+ (0, 0, {'name': 'Consumers'}),
+ (0, 0, {'name': 'Sales'}),
+ (0, 0, {'name': 'Research'}),
+ ],
+ })
+ self.event_question_2 = self.env['event.question'].create({
+ 'title': 'How did you hear about us ?',
+ 'question_type': 'text_box',
+ 'event_id': self.event.id,
+ 'once_per_order': True,
+ })
+
+ # ------------------------------------------------------------
+ # TRACKS
+ # ------------------------------------------------------------
+
+ self.track_0 = self.env['event.track'].create({
+ 'name': 'What This Event Is All About',
+ 'event_id': self.event.id,
+ 'stage_id': self.env.ref('website_event_track.event_track_stage3').id,
+ 'date': self.reference_now + timedelta(hours=1),
+ 'duration': 2,
+ 'is_published': True,
+ 'wishlisted_by_default': True,
+ 'user_id': self.user_admin.id,
+ 'partner_id': self.event_speaker.id,
+ })
+ self.track_1 = self.env['event.track'].create({
+ 'name': 'Live Testimonial',
+ 'event_id': self.event.id,
+ 'stage_id': self.env.ref('website_event_track.event_track_stage3').id,
+ 'date': self.reference_now - timedelta(minutes=30),
+ 'duration': 0.75,
+ 'is_published': True,
+ 'user_id': self.user_admin.id,
+ 'partner_id': self.event_speaker.id,
+ })
+ self.track_2 = self.env['event.track'].create({
+ 'name': 'Our Last Day Together !',
+ 'event_id': self.event.id,
+ 'stage_id': self.env.ref('website_event_track.event_track_stage3').id,
+ 'date': self.reference_now + timedelta(days=1),
+ 'duration': 0.75,
+ 'is_published': True,
+ 'user_id': self.user_admin.id,
+ 'partner_id': self.event_speaker.id,
+ })
+
+ # ------------------------------------------------------------
+ # MEETING ROOMS
+ # ----------------------------------------------------------
+
+ self.env['event.meeting.room'].create({
+ 'name': 'Best wood for furniture',
+ 'summary': 'Let\'s talk about wood types for furniture',
+ 'target_audience': 'wood expert(s)',
+ 'is_pinned': True,
+ 'website_published': True,
+ 'event_id': self.event.id,
+ 'room_lang_id': self.env.ref('base.lang_en').id,
+ 'room_max_capacity': '12',
+ 'room_participant_count': 9,
+ })
+
+ self.event.flush()
diff --git a/addons/test_event_full/tests/test_event_crm.py b/addons/test_event_full/tests/test_event_crm.py
new file mode 100644
index 00000000..5da23531
--- /dev/null
+++ b/addons/test_event_full/tests/test_event_crm.py
@@ -0,0 +1,149 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo.addons.test_event_full.tests.common import TestEventFullCommon
+from odoo.tests import users
+
+
+class TestEventCrm(TestEventFullCommon):
+
+ @classmethod
+ def setUpClass(cls):
+ super(TestEventCrm, cls).setUpClass()
+
+ cls.TICKET1_COUNT, cls.TICKET2_COUNT = 3, 1
+ ticket1 = cls.event_0.event_ticket_ids[0]
+ ticket2 = cls.event_0.event_ticket_ids[1]
+
+ # PREPARE SO DATA
+ # ------------------------------------------------------------
+
+ # adding some tickets to SO
+ cls.customer_so.write({
+ 'order_line': [
+ (0, 0, {
+ 'event_id': cls.event_0.id,
+ 'event_ticket_id': ticket1.id,
+ 'product_id': ticket1.product_id.id,
+ 'product_uom_qty': cls.TICKET1_COUNT,
+ }), (0, 0, {
+ 'event_id': cls.event_0.id,
+ 'event_ticket_id': ticket2.id,
+ 'product_id': ticket2.product_id.id,
+ 'product_uom_qty': cls.TICKET2_COUNT,
+ 'price_unit': 50,
+ })
+ ]
+ })
+
+ @users('user_sales_salesman')
+ def test_event_crm_sale_customer(self):
+ """ Test a SO with a real customer set on it, check partner propagation
+ as well as group-based lead update. """
+ customer_so = self.env['sale.order'].browse(self.customer_so.id)
+
+ # adding some tickets to SO
+ t1_reg_vals = [
+ dict(customer_data,
+ partner_id=customer_so.partner_id.id,
+ sale_order_line_id=customer_so.order_line[0].id)
+ for customer_data in self.website_customer_data[:self.TICKET1_COUNT]
+ ]
+ t1_registrations = self.env['event.registration'].create(t1_reg_vals)
+
+ # check effect: registrations, leads
+ self.assertEqual(self.event_0.registration_ids, t1_registrations)
+ self.assertEqual(len(self.test_rule_order.lead_ids), 1)
+ self.assertEqual(self.test_rule_order_done.lead_ids, self.env['crm.lead'])
+ # check lead converted based on registrations
+ self.assertLeadConvertion(self.test_rule_order, t1_registrations, partner=customer_so.partner_id)
+
+ # SO is confirmed -> missing registrations should be automatically added
+ # and added to the lead as part of the same group
+ customer_so.action_confirm()
+ self.assertEqual(customer_so.state, 'sale')
+ self.assertEqual(len(self.event_0.registration_ids), self.TICKET1_COUNT + self.TICKET2_COUNT)
+ self.assertEqual(len(self.test_rule_order.lead_ids), 1) # no new lead created
+ self.assertEqual(self.test_rule_order_done.lead_ids, self.env['crm.lead']) # this one still not triggered
+
+ # check existing lead has been updated with new registrations
+ self.assertLeadConvertion(self.test_rule_order, self.event_0.registration_ids, partner=customer_so.partner_id)
+
+ # Confirm registrations -> trigger the "DONE" rule, one new lead linked to all
+ # event registrations created in this test as all belong to the same SO
+ self.event_0.registration_ids.write({'state': 'done'})
+ self.assertLeadConvertion(self.test_rule_order_done, self.event_0.registration_ids, partner=customer_so.partner_id)
+
+ @users('user_sales_salesman')
+ def test_event_crm_sale_mixed_group(self):
+ """ Test a mixed sale order line creation. This should not happen in a customer
+ use case but should be supported by the code. """
+ public_partner = self.env.ref('base.public_partner')
+ public_so = self.env['sale.order'].create({
+ 'partner_id': public_partner.id,
+ 'order_line': [
+ (0, 0, {
+ 'event_id': self.event_0.id,
+ 'event_ticket_id': self.event_0.event_ticket_ids[0].id,
+ 'product_id': self.event_0.event_ticket_ids[0].product_id.id,
+ 'product_uom_qty': 2,
+ })
+ ]
+ })
+ customer_so = self.env['sale.order'].browse(self.customer_so.id)
+
+ # make a multi-SO create
+ mixed_reg_vals = [
+ dict(self.website_customer_data[0],
+ partner_id=customer_so.partner_id.id,
+ sale_order_line_id=customer_so.order_line[0].id),
+ dict(self.website_customer_data[1],
+ partner_id=customer_so.partner_id.id,
+ sale_order_line_id=customer_so.order_line[0].id),
+ dict(self.website_customer_data[2],
+ partner_id=public_so.partner_id.id,
+ sale_order_line_id=public_so.order_line[0].id),
+ dict(self.website_customer_data[3],
+ partner_id=public_so.partner_id.id,
+ sale_order_line_id=public_so.order_line[0].id),
+ ]
+ self.env['event.registration'].create(mixed_reg_vals)
+
+ public_regs = self.event_0.registration_ids.filtered(lambda reg: reg.sale_order_id == public_so)
+ self.assertEqual(len(public_regs), 2)
+ customer_regs = self.event_0.registration_ids.filtered(lambda reg: reg.sale_order_id == customer_so)
+ self.assertEqual(len(customer_regs), 2)
+ self.assertLeadConvertion(self.test_rule_order, public_regs, partner=None)
+ self.assertLeadConvertion(self.test_rule_order, customer_regs, partner=customer_so.partner_id)
+
+ @users('user_sales_salesman')
+ def test_event_crm_sale_public(self):
+ """ Test a SO with a public partner on it, then updated when SO is confirmed.
+ This somehow simulates a simplified website_event_sale flow. """
+ public_partner = self.env.ref('base.public_partner')
+ customer_so = self.env['sale.order'].browse(self.customer_so.id)
+ customer_so.write({'partner_id': public_partner.id})
+
+ # adding some tickets to SO
+ t1_reg_vals = [
+ dict(customer_data,
+ partner_id=public_partner.id,
+ sale_order_line_id=customer_so.order_line[0].id)
+ for customer_data in self.website_customer_data[:self.TICKET1_COUNT]
+ ]
+ t1_registrations = self.env['event.registration'].create(t1_reg_vals)
+ self.assertEqual(self.event_0.registration_ids, t1_registrations)
+
+ # check lead converted based on registrations
+ self.assertLeadConvertion(self.test_rule_order, t1_registrations, partner=None)
+
+ # SO is confirmed -> missing registrations should be automatically added
+ # BUT as public user -> no email -> not taken into account by rule
+ customer_so.action_confirm()
+ self.assertEqual(customer_so.state, 'sale')
+ self.assertEqual(len(self.event_0.registration_ids), self.TICKET1_COUNT + self.TICKET2_COUNT)
+ self.assertLeadConvertion(self.test_rule_order, t1_registrations, partner=None)
+
+ # SO has a customer set -> main contact of lead is updated accordingly
+ customer_so.write({'partner_id': self.event_customer.id})
+ self.assertLeadConvertion(self.test_rule_order, t1_registrations, partner=self.event_customer)
diff --git a/addons/test_event_full/tests/test_wevent_register.py b/addons/test_event_full/tests/test_wevent_register.py
new file mode 100644
index 00000000..b1f34d10
--- /dev/null
+++ b/addons/test_event_full/tests/test_wevent_register.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import tests
+from odoo.addons.test_event_full.tests.common import TestWEventCommon
+from odoo.tests.common import HOST
+
+
+@tests.common.tagged('post_install', '-at_install')
+class TestWEventRegister(TestWEventCommon):
+
+ def test_register(self):
+ self.browser_js(
+ '/event',
+ 'odoo.__DEBUG__.services["web_tour.tour"].run("wevent_register")',
+ 'odoo.__DEBUG__.services["web_tour.tour"].tours.wevent_register.ready',
+ login=None
+ )
+ new_registrations = self.event.registration_ids
+ visitor = new_registrations.visitor_id
+
+ # check registration content
+ self.assertEqual(len(new_registrations), 2)
+ self.assertEqual(
+ set(new_registrations.mapped("name")),
+ set(["Raoulette Poiluchette", "Michel Tractopelle"])
+ )
+ self.assertEqual(
+ set(new_registrations.mapped("phone")),
+ set(["0456112233", "0456332211"])
+ )
+ self.assertEqual(
+ set(new_registrations.mapped("email")),
+ set(["raoulette@example.com", "michel@example.com"])
+ )
+
+ # check visitor stored information
+ self.assertEqual(visitor.name, "Raoulette Poiluchette")
+ self.assertEqual(visitor.event_registration_ids, new_registrations)
+ self.assertEqual(visitor.partner_id, self.env['res.partner'])
+ self.assertEqual(visitor.mobile, "0456112233")
+ self.assertEqual(visitor.email, "raoulette@example.com")
+ self.assertFalse(visitor.parent_id)
+ self.assertTrue(visitor.active)
diff --git a/addons/test_event_full/views/assets.xml b/addons/test_event_full/views/assets.xml
new file mode 100644
index 00000000..0b20fc8d
--- /dev/null
+++ b/addons/test_event_full/views/assets.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" ?>
+<odoo><data>
+ <template id="assets_tests" inherit_id="web.assets_tests" name="Full Event Tests Assets">
+ <xpath expr="//script[last()]" position="after">
+ <script type="text/javascript" src="/test_event_full/static/src/js/tours/wevent_register_tour.js"/>
+ </xpath>
+ </template>
+</data></odoo>