from odoo.tests.common import TransactionCase, tagged @tagged('post_install', '-at_install') class TestEventCheckin(TransactionCase): def setUp(self): super().setUp() self.event = self.env['event.event'].create({ 'name': 'Checkin Test Event', 'date_begin': '2030-01-01 10:00:00', 'date_end': '2030-01-01 18:00:00', }) self.registration = self.env['event.registration'].create({ 'event_id': self.event.id, 'name': 'Checkin Attendee', }) def test_valid_token_checks_in(self): qr_value = self.registration._get_ticket_qr_value() status, found = self.env['event.registration']._verify_scanned_token(qr_value) self.assertEqual(status, 'ok') found.action_check_in() self.assertTrue(found.checked_in) self.assertTrue(found.check_in_time) self.assertEqual(found.check_in_user_id, self.env.user) self.assertEqual(found.state, 'done') def test_duplicate_check_in_detected(self): qr_value = self.registration._get_ticket_qr_value() status, found = self.env['event.registration']._verify_scanned_token(qr_value) found.action_check_in() status_again, _found_again = self.env['event.registration']._verify_scanned_token(qr_value) self.assertEqual(status_again, 'already') def test_forged_token_rejected(self): forged_value = f"{self.registration.ticket_ref}|0000000000000000" status, found = self.env['event.registration']._verify_scanned_token(forged_value) self.assertEqual(status, 'invalid') self.assertFalse(found.checked_in) def test_tampered_ticket_ref_rejected(self): real_token = self.registration._compute_ticket_token() other_event = self.env['event.event'].create({ 'name': 'Other Event', 'date_begin': '2030-02-01 10:00:00', 'date_end': '2030-02-01 18:00:00', }) other_registration = self.env['event.registration'].create({ 'event_id': other_event.id, 'name': 'Other Attendee', }) # Attacker takes a valid token and pastes it onto a different ticket_ref. forged_value = f"{other_registration.ticket_ref}|{real_token}" status, found = self.env['event.registration']._verify_scanned_token(forged_value) self.assertEqual(status, 'invalid') def test_manual_lookup_bypasses_signature(self): status, found = self.env['event.registration']._lookup_by_ticket_ref(self.registration.ticket_ref) self.assertEqual(status, 'ok') self.assertEqual(found, self.registration) def test_manual_lookup_unknown_ref(self): status, found = self.env['event.registration']._lookup_by_ticket_ref('NOT-A-REAL-REF') self.assertEqual(status, 'not_found') self.assertFalse(found)