194 lines
7.6 KiB
Python
194 lines
7.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from datetime import timedelta
|
|
|
|
import odoo.tests
|
|
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
|
|
from odoo.addons.payment.tests.http_common import PaymentHttpCommon
|
|
from odoo.fields import Datetime
|
|
from odoo.tools import mute_logger
|
|
|
|
from .common import TestWebsiteEventSaleCommon
|
|
|
|
|
|
@odoo.tests.common.tagged('post_install', '-at_install')
|
|
class TestUi(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon):
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
if self.env['ir.module.module']._get('payment_custom').state != 'installed':
|
|
self.skipTest("Transfer provider is not installed")
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
|
|
cls.env.ref('payment.payment_provider_transfer').write({
|
|
'state': 'enabled',
|
|
'is_published': True,
|
|
})
|
|
|
|
cls.env['event.event.ticket'].create({
|
|
'name': 'VIP',
|
|
'event_id': cls.event_2.id,
|
|
'product_id': cls.env.ref('event_product.product_product_event').id,
|
|
'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
|
|
'price': 1500.0,
|
|
})
|
|
|
|
cls.event_3 = cls.env['event.event'].create({
|
|
'name': 'Last ticket test',
|
|
'user_id': cls.env.ref('base.user_admin').id,
|
|
'date_begin': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 07:00:00'),
|
|
'date_end': (Datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d 16:30:00'),
|
|
'website_published': True,
|
|
})
|
|
|
|
cls.env['event.event.ticket'].create([{
|
|
'name': 'VIP',
|
|
'event_id': cls.event_3.id,
|
|
'product_id': cls.env.ref('event_product.product_product_event').id,
|
|
'end_sale_datetime': (Datetime.today() + timedelta(90)).strftime('%Y-%m-%d'),
|
|
'price': 1500.0,
|
|
'seats_max': 2,
|
|
}])
|
|
|
|
# flush event to ensure having tickets available in the tests
|
|
cls.env.flush_all()
|
|
|
|
(cls.env.ref('base.partner_admin') + cls.partner_demo).write({
|
|
'street': '215 Vine St',
|
|
'city': 'Scranton',
|
|
'zip': '18503',
|
|
'country_id': cls.env.ref('base.us').id,
|
|
'state_id': cls.env.ref('base.state_us_39').id,
|
|
'phone': '+1 555-555-5555',
|
|
'email': 'admin@yourcompany.example.com',
|
|
})
|
|
|
|
cls.env['account.journal'].create({'name': 'Cash - Test', 'type': 'cash', 'code': 'CASH - Test'})
|
|
|
|
def test_admin(self):
|
|
self.env['product.pricelist'].with_context(active_test=False).search([]).unlink()
|
|
# Seen that:
|
|
# - this test relies on demo data that are entirely in USD (pricelists)
|
|
# - that main demo company is gelocated in US
|
|
# - that this test awaits for hardcoded USDs amount
|
|
# we have to force company currency as USDs only for this test
|
|
self.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", [self.env.ref('base.USD').id, self.env.ref('base.main_company').id])
|
|
self.env['product.pricelist'].create({'name': "Public Pricelist"})
|
|
|
|
transfer_provider = self.env.ref('payment.payment_provider_transfer')
|
|
transfer_provider.write({
|
|
'state': 'enabled',
|
|
'is_published': True,
|
|
})
|
|
transfer_provider._transfer_ensure_pending_msg_is_set()
|
|
|
|
self.start_tour("/", 'event_buy_tickets', login="admin")
|
|
|
|
def test_demo(self):
|
|
self.env['product.pricelist'].with_context(active_test=False).search([]).unlink()
|
|
transfer_provider = self.env.ref('payment.payment_provider_transfer')
|
|
transfer_provider.write({
|
|
'state': 'enabled',
|
|
'is_published': True,
|
|
})
|
|
transfer_provider._transfer_ensure_pending_msg_is_set()
|
|
|
|
# Ensure the use of USD (company currency)
|
|
self.env['product.pricelist'].create({'name': "Public Pricelist"})
|
|
|
|
self.start_tour("/", 'event_buy_tickets', login="demo")
|
|
|
|
def test_buy_last_ticket(self):
|
|
transfer_provider = self.env.ref('payment.payment_provider_transfer')
|
|
transfer_provider.write({
|
|
'state': 'enabled',
|
|
'is_published': True,
|
|
})
|
|
transfer_provider._transfer_ensure_pending_msg_is_set()
|
|
|
|
self.start_tour("/", 'event_buy_last_ticket')
|
|
|
|
def test_pricelists_different_currencies(self):
|
|
self.env.user.groups_id += self.env.ref('product.group_product_pricelist')
|
|
self.start_tour("/", 'event_sale_pricelists_different_currencies', login='admin')
|
|
# TO DO - add public test with new address when convert to web.tour format.
|
|
|
|
|
|
@odoo.tests.common.tagged('post_install', '-at_install')
|
|
class TestRoutes(HttpCaseWithUserDemo, TestWebsiteEventSaleCommon, PaymentHttpCommon):
|
|
|
|
@mute_logger('odoo.http')
|
|
def test_check_seats_avail_before_purchase(self):
|
|
self.authenticate(None, None)
|
|
|
|
so_line_1, so_line_2 = self.env['sale.order.line'].create([
|
|
{
|
|
'event_id': self.event.id,
|
|
'event_ticket_id': self.ticket.id,
|
|
'name': self.event.name,
|
|
'order_id': self.so.id,
|
|
'product_id': self.ticket.product_id.id,
|
|
'product_uom_qty': 2,
|
|
},
|
|
{
|
|
'event_id': self.event_2.id,
|
|
'event_ticket_id': self.ticket_2.id,
|
|
'name': self.event_2.name,
|
|
'order_id': self.so.id,
|
|
'product_id': self.ticket_2.product_id.id,
|
|
},
|
|
])
|
|
self.so._cart_update(line_id=so_line_1.id, product_id=self.ticket.product_id.id)
|
|
self.so._cart_update(line_id=so_line_2.id, product_id=self.ticket_2.product_id.id)
|
|
self.so.order_line.product_uom_qty = 2
|
|
|
|
url = self._build_url(f'/shop/payment/transaction/{self.so.id}')
|
|
self.assertEqual(self.event.seats_taken, 0)
|
|
self.assertEqual(self.event_2.seats_taken, 0)
|
|
self.env['event.registration'].create([
|
|
{
|
|
'event_id': self.event.id,
|
|
'event_ticket_id': self.ticket.id,
|
|
'name': 'reg1',
|
|
'state': 'done',
|
|
},
|
|
{
|
|
'event_id': self.event_2.id,
|
|
'event_ticket_id': self.ticket_2.id,
|
|
'name': 'reg2',
|
|
'state': 'done',
|
|
}
|
|
])
|
|
self.assertEqual(self.event.seats_taken, 1)
|
|
self.assertEqual(self.event_2.seats_taken, 1)
|
|
self.ticket.write({
|
|
'seats_max': 2,
|
|
'seats_limited': True,
|
|
})
|
|
self.ticket_2.write({
|
|
'seats_max': 2,
|
|
'seats_limited': True,
|
|
})
|
|
self.env['event.registration'].create([
|
|
{'event_id': e.id, 'sale_order_id': self.so.id, 'partner_id': p.id, 'event_ticket_id': t.id}
|
|
for p in [(self.partner), (self.partner_admin)]
|
|
for e, t in [(self.event, self.ticket), (self.event_2, self.ticket_2)]
|
|
])
|
|
route_kwargs = {
|
|
'provider_id': self.provider.id,
|
|
'payment_method_id': self.payment_method.id,
|
|
'token_id': None,
|
|
'amount': self.so.amount_total,
|
|
'flow': 'direct',
|
|
'tokenization_requested': False,
|
|
'landing_route': '/shop/payment/validate',
|
|
'is_validation': False,
|
|
'csrf_token': odoo.http.Request.csrf_token(self),
|
|
'access_token': self.so._portal_ensure_token(),
|
|
}
|
|
with self.assertRaisesRegex(odoo.tests.JsonRpcException, 'odoo.exceptions.ValidationError'):
|
|
self.make_jsonrpc_request(url, route_kwargs)
|