# 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