Files
odoo_source/addons/lunch/tests/test_supplier.py
T
RomainLibert 855c6dac25 [IMP] lunch: automatize lunch orders
We would like to automatize lunch as currently all orders are manually ordered and validated,
and a cash move has to be manually created each time you want to credit the wallet of some user.

1/ In this commit we add a new widget that comes with the kanban view
   and will allow to take orders in a friendly manner.
2/ We also add a lunch.supplier model this also allows you to configure an
   automatic ordering via email.
3/ Introduces new lunch.location model to replace res.partner on suppliers
4/ New mail template for automatic ordering
5/ Add the concept of new products (mark a product as new until some date)
6/ The toppings are now defined by product category
7/ Lunch.order removed, lunch.order.line renamed into lunch.order
8/ New SQL report to get the wallet content (aggregate of lunch.cashmove and lunch.order)
9/ New setting to allow negative wallet (aka overdraft)
10/ Application now remembers what notes and toppings you last ordered with your product
11/ You can change your location using the widget on the kanban view
12/ Edition of the order can be done until the order is arrived

TaskID: 1856876
TaskID: 1916105

closes odoo/odoo#30028
2019-01-18 15:33:04 +00:00

124 lines
5.5 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import pytz
from datetime import datetime
from unittest.mock import patch
from odoo import fields
from odoo.addons.lunch.tests.common import TestsCommon
class TestSupplier(TestsCommon):
def setUp(self):
super(TestSupplier, self).setUp()
self.monday_1am = datetime(2018, 10, 29, 1, 0, 0)
self.monday_10am = datetime(2018, 10, 29, 10, 0, 0)
self.monday_1pm = datetime(2018, 10, 29, 13, 0, 0)
self.monday_8pm = datetime(2018, 10, 29, 20, 0, 0)
self.saturday_3am = datetime(2018, 11, 3, 3, 0, 0)
self.saturday_10am = datetime(2018, 11, 3, 10, 0, 0)
self.saturday_1pm = datetime(2018, 11, 3, 13, 0, 0)
self.saturday_8pm = datetime(2018, 11, 3, 20, 0, 0)
def test_compute_available_today(self):
tests = [(self.monday_1am, True), (self.monday_10am, True),
(self.monday_1pm, True), (self.monday_8pm, True),
(self.saturday_3am, False), (self.saturday_10am, False),
(self.saturday_1pm, False), (self.saturday_8pm, False)]
for value, result in tests:
with patch.object(fields.Datetime, 'now', return_value=value) as _:
assert self.supplier_pizza_inn.available_today == result,\
'supplier pizza inn should %s considered available on %s' % ('be' if result else 'not be', value)
self.env['lunch.supplier'].invalidate_cache(['available_today'], [self.supplier_pizza_inn.id])
def test_search_available_today(self):
'''
This test checks that _search_available_today returns a valid domain
'''
Supplier = self.env['lunch.supplier']
tests = [(self.monday_1am, 1.0, 'monday'), (self.monday_10am, 10.0, 'monday'),
(self.monday_1pm, 13.0, 'monday'), (self.monday_8pm, 20.0, 'monday'),
(self.saturday_3am, 3.0, 'saturday'), (self.saturday_10am, 10.0, 'saturday'),
(self.saturday_1pm, 13.0, 'saturday'), (self.saturday_8pm, 20.0, 'saturday')]
# It should return an empty domain if we compare to values other than datetime
assert Supplier._search_available_today('>', 7) == []
assert Supplier._search_available_today('>', True) == []
for value, rvalue, dayname in tests:
with patch.object(fields.Datetime, 'now', return_value=value) as _:
assert Supplier._search_available_today('=', True) == ['&', '|', ('recurrency_end_date', '=', False),
('recurrency_end_date', '>', value.replace(tzinfo=pytz.UTC).astimezone(pytz.timezone(self.env.user.tz))),
('recurrency_%s' % (dayname), '=', True)],\
'Wrong domain generated for values (%s, %s)' % (value, rvalue)
with patch.object(fields.Datetime, 'now', return_value=self.monday_10am) as _:
assert self.supplier_pizza_inn in Supplier.search([('available_today', '=', True)])
def test_auto_email_send(self):
with patch.object(fields.Datetime, 'now', return_value=self.monday_1pm) as _:
with patch.object(fields.Date, 'today', return_value=self.monday_1pm.date()) as _:
with patch.object(fields.Date, 'context_today', return_value=self.monday_1pm.date()) as _:
line = self.env['lunch.order'].create({
'product_id': self.product_pizza.id,
'date': self.monday_1pm.date()
})
line.action_order()
assert line.state == 'ordered'
self.supplier_pizza_inn._auto_email_send()
assert line.state == 'confirmed'
line = self.env['lunch.order'].create({
'product_id': self.product_pizza.id,
'topping_ids_1': [(6, 0, [self.topping_olives.id])],
'date': self.monday_1pm.date()
})
line2 = self.env['lunch.order'].create({
'product_id': self.product_sandwich_tuna.id,
'date': self.monday_1pm.date()
})
(line | line2).action_order()
assert line.state == 'ordered'
assert line2.state == 'ordered'
self.supplier_pizza_inn._auto_email_send()
assert line.state == 'confirmed'
assert line2.state == 'ordered'
line_1 = self.env['lunch.order'].create({
'product_id': self.product_pizza.id,
'quantity': 2,
'date': self.monday_1pm.date()
})
line_2 = self.env['lunch.order'].create({
'product_id': self.product_pizza.id,
'topping_ids_1': [(6, 0, [self.topping_olives.id])],
'date': self.monday_1pm.date()
})
line_3 = self.env['lunch.order'].create({
'product_id': self.product_sandwich_tuna.id,
'quantity': 2,
'date': self.monday_1pm.date()
})
(line_1 | line_2 | line_3).action_order()
assert all(line.state == 'ordered' for line in [line_1, line_2, line_3])
self.supplier_pizza_inn._auto_email_send()