# Copyright (C) 2017 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import shutil import tempfile import unittest import ick2 class StateTestsBase: def setUp(self): self.tempdir = tempfile.mkdtemp() self.statedir = os.path.join(self.tempdir, 'state/dir') def tearDown(self): shutil.rmtree(self.tempdir) def create_state(self): state = ick2.ControllerState() state.set_state_directory(self.statedir) return state class ControllerStateTests(StateTestsBase, unittest.TestCase): def test_has_no_state_directory_initially(self): state = ick2.ControllerState() self.assertTrue(state.get_state_directory() is None) def test_sets_and_creates_state_directory(self): state = self.create_state() statedir = state.get_state_directory() self.assertEqual(statedir, self.statedir) self.assertTrue(os.path.exists(statedir)) class ResourceStateTests(StateTestsBase, unittest.TestCase): def test_has_not_resources_initially(self): state = self.create_state() self.assertEqual(state.get_resources('project'), []) def test_creates_resource(self): project = { 'project': 'foo', 'shell_steps': ['build'], } state = self.create_state() state.add_resource('projects', project['project'], project) self.assertEqual(state.get_resources('projects'), [project]) self.assertTrue( os.path.exists(state.get_resource_filename('projects', 'foo'))) def test_loads_resource_from_state_directory(self): project = { 'project': 'foo', 'shell_steps': ['build'], } state = self.create_state() state.add_resource('projects', project['project'], project) state2 = self.create_state() state2.load_resources('projects') self.assertEqual(state2.get_resources('projects'), [project]) def test_gets_named_resource(self): project = { 'project': 'foo', 'shell_steps': ['build'], } state = self.create_state() state.add_resource('projects', project['project'], project) self.assertEqual(state.get_resource('projects', 'foo'), project) def test_updates_named_resource(self): project_v1 = { 'project': 'foo', 'shell_steps': ['build'], } project_v2 = dict(project_v1) project_v2['shell_steps'] = ['build it using magic'] state = self.create_state() state.add_resource('projects', 'foo', project_v1) updated = state.update_resource('projects', 'foo', project_v2) self.assertEqual(updated, project_v2) self.assertEqual(state.get_resource('projects', 'foo'), project_v2) def test_deletes_named_resource(self): project = { 'project': 'foo', 'shell_steps': ['build'], } state = self.create_state() state.add_resource('projects', project['project'], project) state.remove_resource('projects', 'foo') self.assertEqual(state.get_resources('projects'), []) with self.assertRaises(ick2.NotFound): state.get_resource('projects', 'foo') def test_raises_error_deleting_missing_resource(self): state = self.create_state() with self.assertRaises(ick2.NotFound): state.remove_resource('projects', 'foo')