# Copyright 2014 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # =*= License: GPL-3+ =*= import os import shutil import tempfile import unittest import distixlib class TicketStoreTests(unittest.TestCase): def setUp(self): self.tempdir = tempfile.mkdtemp() self.store_dir = os.path.join( self.tempdir, distixlib.tickets_dir_name) self.ticket_store = distixlib.TicketStore(self.store_dir) self.ticket = distixlib.Ticket() def tearDown(self): shutil.rmtree(self.tempdir) def test_is_empty_initially(self): self.assertListEqual(self.ticket_store.get_ticket_ids(), []) self.assertListEqual(self.ticket_store.get_tickets(), []) def test_is_empty_even_when_directory_doesnt_exist(self): does_not_exist = os.path.join(self.tempdir, 'does-not-exist') other_store = distixlib.TicketStore(does_not_exist) self.assertListEqual(other_store.get_tickets(), []) def test_raises_error_when_creating_ticket_without_id(self): self.assertRaises( distixlib.TicketHasNoId, self.ticket_store.add_ticket, self.ticket) def test_adds_ticket(self): self.ticket.set_ticket_id('foo-id') filenames = self.ticket_store.add_ticket(self.ticket) tickets = self.ticket_store.get_tickets() ticket_ids = self.ticket_store.get_ticket_ids() self.assertListEqual(ticket_ids, [t.get_ticket_id() for t in tickets]) self.assertListEqual(ticket_ids, ['foo-id']) self.assertGreater(len(filenames), 0) def test_raises_error_when_existing_ticket_is_added(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) self.assertRaises( distixlib.TicketAlreadyInStoreError, self.ticket_store.add_ticket, self.ticket) def test_ticket_store_is_persistent_in_directory(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) other_store = distixlib.TicketStore(self.store_dir) tickets = other_store.get_tickets() ticket_ids = [t.get_ticket_id() for t in tickets] self.assertListEqual(ticket_ids, ['foo-id']) def test_raises_error_when_getting_requested_ticket(self): self.assertRaises( distixlib.TicketNotInStoreError, self.ticket_store.get_ticket, 'does-not-exist-id') def test_gets_requested_ticket(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) other_ticket = self.ticket_store.get_ticket('foo-id') self.assertEqual(other_ticket.get_ticket_id(), 'foo-id') def test_is_clean_initially(self): self.assertFalse(self.ticket_store.is_dirty()) def test_adding_ticket_makes_dirty(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) self.assertTrue(self.ticket_store.is_dirty()) def test_becomes_dirty_if_ticket_becomes_dirty(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) other_store = distixlib.TicketStore(self.store_dir) ticket = other_store.get_ticket('foo-id') ticket.set_title('foo-title') self.assertTrue(other_store.is_dirty()) def test_can_be_made_clean(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) self.ticket_store.make_clean() self.assertFalse(self.ticket_store.is_dirty()) def test_making_clean_makes_tickets_also_clean(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) self.ticket_store.make_clean() self.ticket.add_metadata_key_value_pair('foo', 'bar') self.ticket_store.make_clean() self.assertFalse(self.ticket_store.is_dirty()) def test_returns_same_ticket_object_for_same_ticket_id(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) other_store = distixlib.TicketStore(self.store_dir) first = other_store.get_ticket('foo-id') second = other_store.get_ticket('foo-id') self.assertEqual(id(first), id(second)) def test_adding_ticket_makes_get_ticket_return_that_object(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) maybe_same_ticket = self.ticket_store.get_ticket('foo-id') self.assertEqual(id(self.ticket), id(maybe_same_ticket)) def test_getting_all_tickets_returns_same_objects(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) tickets = self.ticket_store.get_tickets() self.assertListEqual( [id(ticket) for ticket in tickets], [id(self.ticket)]) def test_gets_ticket_by_unique_id_prefix(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) self.assertEqual(self.ticket_store.get_ticket('foo'), self.ticket) def test_fails_getging_ticket_by_id_prefix_if_not_unique(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) ticket2 = distixlib.Ticket() ticket2.set_ticket_id('foo-id2') self.ticket_store.add_ticket(ticket2) with self.assertRaises(distixlib.TicketNotInStoreError): self.ticket_store.get_ticket('foo') def test_saving_makes_store_clean(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) self.ticket_store.save_changes() self.assertFalse(self.ticket_store.is_dirty()) def test_save_changes_returns_list_of_filenames(self): self.ticket.set_ticket_id('foo-id') self.ticket_store.add_ticket(self.ticket) filenames = self.ticket_store.save_changes() self.assertIsInstance(filenames, list) self.assertGreater(len(filenames), 0) self.assertTrue(all(type(x) == str for x in filenames))