cashbook/tests/test_line.py

365 lines
13 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import os, requests
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
from trytond.pool import Pool
from trytond.transaction import Transaction
from trytond.exceptions import UserError
from datetime import date
class LineTestCase(ModuleTestCase):
'Test cashbook line module'
module = 'cashbook'
@with_transaction()
def test_line_create_check_names_search(self):
""" create cashbook + line
"""
pool = Pool()
Book = pool.get('cashbook.book')
Types = pool.get('cashbook.type')
Lines = pool.get('cashbook.line')
types, = Types.search([('short', '=','CAS')])
book, = Book.create([{
'name': 'Book 1',
'btype': types.id,
'lines': [('create', [{
'date': date(2022, 5, 1),
'description': 'Text 1',
}, {
'date': date(2022, 5, 2),
'description': 'Text 2',
}])],
}])
self.assertEqual(book.name, 'Book 1')
self.assertEqual(book.btype.rec_name, 'CAS - Cash')
self.assertEqual(book.state, 'open')
self.assertEqual(len(book.lines), 2)
self.assertEqual(book.lines[0].date, date(2022, 5, 1))
self.assertEqual(book.lines[0].rec_name, '05/01/2022 Text 1')
self.assertEqual(book.lines[0].state_cashbook, 'open')
self.assertEqual(book.lines[1].date, date(2022, 5, 2))
self.assertEqual(book.lines[1].rec_name, '05/02/2022 Text 2')
self.assertEqual(Lines.search_count([('rec_name', '=', 'Text 1')]), 1)
self.assertEqual(Lines.search_count([('rec_name', '=', 'Text 1a')]), 0)
self.assertEqual(Lines.search_count([('rec_name', 'ilike', 'text%')]), 2)
self.assertEqual(Lines.search_count([('state_cashbook', '=', 'open')]), 2)
self.assertEqual(Lines.search_count([('state_cashbook', '=', 'closed')]), 0)
self.assertEqual(Lines.search_count([('cashbook.state', '=', 'open')]), 2)
self.assertEqual(Lines.search_count([('cashbook.state', '=', 'closed')]), 0)
@with_transaction()
def test_line_delete_with_book_in_open_state(self):
""" create cashbook + line, book in state=open, delete a line
"""
pool = Pool()
Book = pool.get('cashbook.book')
Types = pool.get('cashbook.type')
Lines = pool.get('cashbook.line')
types, = Types.search([('short', '=','CAS')])
book, = Book.create([{
'name': 'Book 1',
'btype': types.id,
'lines': [('create', [{
'date': date(2022, 5, 1),
'description': 'Text 1',
}, {
'date': date(2022, 5, 2),
'description': 'Text 2',
}])],
}])
self.assertEqual(book.name, 'Book 1')
self.assertEqual(len(book.lines), 2)
self.assertEqual(book.state, 'open')
Lines.delete([book.lines[0]])
@with_transaction()
def test_line_delete_with_book_in_closed_state(self):
""" create cashbook + line, book in state=closed, delete a line
"""
pool = Pool()
Book = pool.get('cashbook.book')
Types = pool.get('cashbook.type')
Lines = pool.get('cashbook.line')
types, = Types.search([('short', '=','CAS')])
book, = Book.create([{
'name': 'Book 1',
'btype': types.id,
'lines': [('create', [{
'date': date(2022, 5, 1),
'description': 'Text 1',
}, {
'date': date(2022, 5, 2),
'description': 'Text 2',
}])],
}])
self.assertEqual(book.name, 'Book 1')
self.assertEqual(len(book.lines), 2)
self.assertEqual(book.state, 'open')
Book.wfclosed([book])
self.assertEqual(book.state, 'closed')
self.assertRaisesRegex(UserError,
"The cashbook line '05/01/2022 Text 1' cannot be deleted because the Cashbook 'Book 1' is in state 'Closed'.",
Lines.delete,
[book.lines[0]])
@with_transaction()
def test_line_delete_with_line_in_check_state(self):
""" create cashbook + line, line in state=check, delete a line
"""
pool = Pool()
Book = pool.get('cashbook.book')
Types = pool.get('cashbook.type')
Lines = pool.get('cashbook.line')
types, = Types.search([('short', '=','CAS')])
book, = Book.create([{
'name': 'Book 1',
'btype': types.id,
'lines': [('create', [{
'date': date(2022, 5, 1),
'description': 'Text 1',
}, {
'date': date(2022, 5, 2),
'description': 'Text 2',
}])],
}])
self.assertEqual(book.name, 'Book 1')
self.assertEqual(len(book.lines), 2)
self.assertEqual(book.state, 'open')
self.assertEqual(book.lines[0].state, 'edit')
Lines.wfcheck([book.lines[0]])
self.assertEqual(book.lines[0].state, 'check')
self.assertRaisesRegex(UserError,
"The cashbook line '05/01/2022 Text 1' cannot be deleted, its in state 'Checked'.",
Lines.delete,
[book.lines[0]])
@with_transaction()
def test_line_permission_owner(self):
""" create book+line + 2x users, add users to group, check access
"""
pool = Pool()
ResUser = pool.get('res.user')
ResGroup = pool.get('res.group')
Book = pool.get('cashbook.book')
Line = pool.get('cashbook.line')
Types = pool.get('cashbook.type')
types, = Types.search([('short', '=', 'CAS')])
grp_cashbook, = ResGroup.search([('name', '=', 'Cashbook')])
usr_lst = ResUser.create([{
'login': 'frida',
'name': 'Frida',
'groups': [('add', [grp_cashbook.id])],
}, {
'login': 'diego',
'name': 'Diego',
'groups': [('add', [grp_cashbook.id])],
}])
self.assertEqual(len(usr_lst), 2)
self.assertEqual(usr_lst[0].name, 'Frida')
self.assertEqual(usr_lst[1].name, 'Diego')
book, = Book.create([{
'name': 'Fridas book',
'owner': usr_lst[0].id,
'btype': types.id,
'lines': [('create', [{
'date': date(2022, 5, 1),
'description': 'Test 1',
}])],
}])
self.assertEqual(book.rec_name, 'Fridas book'),
self.assertEqual(book.owner.rec_name, 'Frida'),
with Transaction().set_context({
'_check_access': True,
}):
# change to user 'diego' , try access
with Transaction().set_user(usr_lst[1].id):
lines = Line.search([])
self.assertEqual(len(lines), 0)
# change to user 'frida' read/write book
with Transaction().set_user(usr_lst[0].id):
lines = Line.search([])
self.assertEqual(len(lines), 1)
self.assertEqual(lines[0].cashbook.rec_name, 'Fridas book')
self.assertEqual(lines[0].rec_name, '05/01/2022 Test 1')
Line.write(*[
lines,
{
'description': 'Test 2',
}])
self.assertEqual(lines[0].rec_name, '05/01/2022 Test 2')
@with_transaction()
def test_line_permission_reviewer(self):
""" create book+line + 2x users + 1x reviewer-group, add users to group, check access
"""
pool = Pool()
ResUser = pool.get('res.user')
ResGroup = pool.get('res.group')
Book = pool.get('cashbook.book')
Line = pool.get('cashbook.line')
Types = pool.get('cashbook.type')
types, = Types.search([('short', '=', 'CAS')])
grp_cashbook, = ResGroup.search([('name', '=', 'Cashbook')])
grp_reviewer, = ResGroup.create([{
'name': 'Cashbook Reviewer',
}])
usr_lst = ResUser.create([{
'login': 'frida',
'name': 'Frida',
'groups': [('add', [grp_cashbook.id])],
}, {
'login': 'diego',
'name': 'Diego',
'groups': [('add', [grp_cashbook.id, grp_reviewer.id])],
}])
self.assertEqual(len(usr_lst), 2)
self.assertEqual(usr_lst[0].name, 'Frida')
self.assertEqual(usr_lst[1].name, 'Diego')
# create cashbook
# add reviewer-group to allow write for users in group
book, = Book.create([{
'name': 'Fridas book',
'owner': usr_lst[0].id,
'reviewer': grp_reviewer.id,
'btype': types.id,
'lines': [('create', [{
'date': date(2022, 5, 1),
'description': 'Test 1',
}])],
}])
self.assertEqual(book.rec_name, 'Fridas book'),
self.assertEqual(book.owner.rec_name, 'Frida'),
with Transaction().set_context({
'_check_access': True,
}):
# change to user 'diego' , try access
with Transaction().set_user(usr_lst[1].id):
lines = Line.search([])
self.assertEqual(len(lines), 1)
self.assertEqual(len(lines[0].cashbook.reviewer.users), 1)
self.assertEqual(lines[0].cashbook.reviewer.users[0].rec_name, 'Diego')
self.assertEqual(lines[0].rec_name, '05/01/2022 Test 1')
Line.write(*[
lines,
{
'description': 'Test 2',
}])
self.assertEqual(lines[0].rec_name, '05/01/2022 Test 2')
# change to user 'frida' read/write line
with Transaction().set_user(usr_lst[0].id):
lines = Line.search([])
self.assertEqual(len(lines), 1)
self.assertEqual(lines[0].rec_name, '05/01/2022 Test 2')
Line.write(*[
lines,
{
'description': 'Test 3',
}])
self.assertEqual(lines[0].rec_name, '05/01/2022 Test 3')
@with_transaction()
def test_line_permission_observer(self):
""" create book+line + 2x users + 1x observer-group, add users to group, check access
"""
pool = Pool()
ResUser = pool.get('res.user')
ResGroup = pool.get('res.group')
Book = pool.get('cashbook.book')
Line = pool.get('cashbook.line')
Types = pool.get('cashbook.type')
types, = Types.search([('short', '=', 'CAS')])
grp_cashbook, = ResGroup.search([('name', '=', 'Cashbook')])
grp_observer, = ResGroup.create([{
'name': 'Cashbook Observer',
}])
usr_lst = ResUser.create([{
'login': 'frida',
'name': 'Frida',
'groups': [('add', [grp_cashbook.id])],
}, {
'login': 'diego',
'name': 'Diego',
'groups': [('add', [grp_cashbook.id, grp_observer.id])],
}])
self.assertEqual(len(usr_lst), 2)
self.assertEqual(usr_lst[0].name, 'Frida')
self.assertEqual(usr_lst[1].name, 'Diego')
# create cashbook
# add reviewer-group to allow write for users in group
book, = Book.create([{
'name': 'Fridas book',
'owner': usr_lst[0].id,
'observer': grp_observer.id,
'btype': types.id,
'lines': [('create', [{
'date': date(2022, 5, 1),
'description': 'Test 1',
}])],
}])
self.assertEqual(book.rec_name, 'Fridas book'),
self.assertEqual(book.owner.rec_name, 'Frida'),
with Transaction().set_context({
'_check_access': True,
}):
# change to user 'diego' , try access
with Transaction().set_user(usr_lst[1].id):
lines = Line.search([])
self.assertEqual(len(lines), 1)
self.assertEqual(len(lines[0].cashbook.observer.users), 1)
self.assertEqual(lines[0].cashbook.observer.users[0].rec_name, 'Diego')
self.assertEqual(lines[0].rec_name, '05/01/2022 Test 1')
self.assertRaisesRegex(UserError,
'You are not allowed to write to records "[0-9]{1,}" of "Cashbook Line" because of at least one of these rules:\nOwners and reviewers: Cashbook line write - ',
Line.write,
*[
lines,
{
'description': 'Test 2',
},
])
# change to user 'frida' read/write line
with Transaction().set_user(usr_lst[0].id):
lines = Line.search([])
self.assertEqual(len(lines), 1)
self.assertEqual(lines[0].rec_name, '05/01/2022 Test 1')
Line.write(*[
lines,
{
'description': 'Test 2',
}])
self.assertEqual(lines[0].rec_name, '05/01/2022 Test 2')
# end LineTestCase