# Copyright (C) 2018 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 unittest import ick2 class BuildTests(unittest.TestCase): def setUp(self): as_dict = { 'status': ick2.BUILD_TRIGGERED, } self.resource = ick2.resource_from_dict(as_dict) def test_is_finished_when_done(self): build = ick2.Build(self.resource) self.assertEqual(build.get_status(), ick2.BUILD_TRIGGERED) self.assertFalse(build.is_finished()) build.set_status(ick2.BUILD_BUILDING) self.assertFalse(build.is_finished()) build.set_status(ick2.BUILD_DONE) self.assertTrue(build.is_finished()) def test_is_finished_when_failed(self): build = ick2.Build(self.resource) self.assertEqual(build.get_status(), ick2.BUILD_TRIGGERED) self.assertFalse(build.is_finished()) build.set_status(ick2.BUILD_BUILDING) self.assertFalse(build.is_finished()) build.set_status(ick2.BUILD_FAILED) self.assertTrue(build.is_finished()) def test_sets_status_from_triggered_only_when_acceptable(self): build = ick2.Build(self.resource) with self.assertRaises(ick2.WrongBuildStatusChange): build.set_status(ick2.BUILD_TRIGGERED) self.assertEqual(build.get_status(), ick2.BUILD_TRIGGERED) with self.assertRaises(ick2.WrongBuildStatusChange): build.set_status(ick2.BUILD_DONE) self.assertEqual(build.get_status(), ick2.BUILD_TRIGGERED) with self.assertRaises(ick2.WrongBuildStatusChange): build.set_status(ick2.BUILD_FAILED) self.assertEqual(build.get_status(), ick2.BUILD_TRIGGERED) build.set_status(ick2.BUILD_BUILDING) self.assertEqual(build.get_status(), ick2.BUILD_BUILDING) def test_refuses_changing_status_from_building_when_unacceptable(self): build = ick2.Build(self.resource) build.set_status(ick2.BUILD_BUILDING) with self.assertRaises(ick2.WrongBuildStatusChange): build.set_status(ick2.BUILD_TRIGGERED) self.assertEqual(build.get_status(), ick2.BUILD_BUILDING) with self.assertRaises(ick2.WrongBuildStatusChange): build.set_status(ick2.BUILD_BUILDING) self.assertEqual(build.get_status(), ick2.BUILD_BUILDING) def test_changes_status_from_building_to_done(self): build = ick2.Build(self.resource) build.set_status(ick2.BUILD_BUILDING) build.set_status(ick2.BUILD_DONE) self.assertEqual(build.get_status(), ick2.BUILD_DONE) def test_changes_status_from_building_to_failed(self): build = ick2.Build(self.resource) build.set_status(ick2.BUILD_BUILDING) build.set_status(ick2.BUILD_FAILED) self.assertEqual(build.get_status(), ick2.BUILD_FAILED) def test_has_empty_build_graph_initially(self): build = ick2.Build(self.resource) graph = build.get_graph() self.assertTrue(isinstance(graph, ick2.BuildGraph)) self.assertEqual(graph.get_actions(), {}) def test_has_build_graph_from_resource(self): self.resource['graph'] = { 1: { 'action': {'action': 'foo'}, 'status': ick2.ACTION_READY, 'depends': [], }, } build = ick2.Build(self.resource) graph = build.get_graph() self.assertEqual(graph.get_actions(), self.resource['graph']) def test_appending_actions_to_build_graph_shows_in_build_resource(self): build = ick2.Build(self.resource) graph = build.get_graph() action_id = graph.append_action({'action': 'foo'}) self.assertEqual( self.resource['graph'], { action_id: { 'action': {'action': 'foo'}, 'status': ick2.ACTION_READY, 'depends': [], }, } ) def test_updating_actions_in_build_graph_changes_build_resource(self): build = ick2.Build(self.resource) graph = build.get_graph() action_id = graph.append_action({'action': 'foo'}) graph.set_action_status(action_id, ick2.BUILD_BUILDING) self.assertEqual( self.resource['graph'], { action_id: { 'action': {'action': 'foo'}, 'status': ick2.BUILD_BUILDING, 'depends': [], }, } )