OSM DB Update Charm
[osm/devops.git] / installers / charm / osm-update-db-operator / tests / unit / test_charm.py
1 # Copyright 2022 Canonical Ltd.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License"); you may
4 # not use this file except in compliance with the License. You may obtain
5 # a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 # License for the specific language governing permissions and limitations
13 # under the License.
14
15 import unittest
16 from unittest.mock import Mock, patch
17
18 from ops.model import ActiveStatus, BlockedStatus, MaintenanceStatus
19 from ops.testing import Harness
20
21 from charm import UpgradeDBCharm
22
23
24 class TestCharm(unittest.TestCase):
25 def setUp(self):
26 self.harness = Harness(UpgradeDBCharm)
27 self.addCleanup(self.harness.cleanup)
28 self.harness.begin()
29
30 def test_initial_config(self):
31 self.assertEqual(self.harness.model.unit.status, MaintenanceStatus(""))
32
33 def test_config_changed(self):
34 self.harness.update_config({"mongodb-uri": "foo"})
35 self.assertEqual(self.harness.model.unit.status, ActiveStatus())
36
37 def test_config_changed_blocked(self):
38 self.harness.update_config({"log-level": "DEBUG"})
39 self.assertEqual(
40 self.harness.model.unit.status,
41 BlockedStatus("mongodb-uri and/or mysql-uri must be set"),
42 )
43
44 def test_update_db_fail_only_params(self):
45 action_event = Mock(
46 params={
47 "current-version": 9,
48 "target-version": 10,
49 "mysql-only": True,
50 "mongodb-only": True,
51 }
52 )
53 self.harness.charm._on_update_db_action(action_event)
54 self.assertEqual(
55 action_event.fail.call_args,
56 [("Failed DB Upgrade: cannot set both mysql-only and mongodb-only options to True",)],
57 )
58
59 @patch("charm.MongoUpgrade")
60 @patch("charm.MysqlUpgrade")
61 def test_update_db_mysql(self, mock_mysql_upgrade, mock_mongo_upgrade):
62 self.harness.update_config({"mysql-uri": "foo"})
63 action_event = Mock(
64 params={
65 "current-version": 9,
66 "target-version": 10,
67 "mysql-only": True,
68 "mongodb-only": False,
69 }
70 )
71 self.harness.charm._on_update_db_action(action_event)
72 mock_mysql_upgrade().upgrade.assert_called_once()
73 mock_mongo_upgrade.assert_not_called()
74
75 @patch("charm.MongoUpgrade")
76 @patch("charm.MysqlUpgrade")
77 def test_update_db_mongo(self, mock_mysql_upgrade, mock_mongo_upgrade):
78 self.harness.update_config({"mongodb-uri": "foo"})
79 action_event = Mock(
80 params={
81 "current-version": 7,
82 "target-version": 10,
83 "mysql-only": False,
84 "mongodb-only": True,
85 }
86 )
87 self.harness.charm._on_update_db_action(action_event)
88 mock_mongo_upgrade().upgrade.assert_called_once()
89 mock_mysql_upgrade.assert_not_called()
90
91 @patch("charm.MongoUpgrade")
92 def test_update_db_not_configured_mongo_fail(self, mock_mongo_upgrade):
93 action_event = Mock(
94 params={
95 "current-version": 7,
96 "target-version": 10,
97 "mysql-only": False,
98 "mongodb-only": True,
99 }
100 )
101 self.harness.charm._on_update_db_action(action_event)
102 mock_mongo_upgrade.assert_not_called()
103 self.assertEqual(
104 action_event.fail.call_args,
105 [("Failed DB Upgrade: mongo-uri not set",)],
106 )
107
108 @patch("charm.MysqlUpgrade")
109 def test_update_db_not_configured_mysql_fail(self, mock_mysql_upgrade):
110 action_event = Mock(
111 params={
112 "current-version": 7,
113 "target-version": 10,
114 "mysql-only": True,
115 "mongodb-only": False,
116 }
117 )
118 self.harness.charm._on_update_db_action(action_event)
119 mock_mysql_upgrade.assert_not_called()
120 self.assertEqual(
121 action_event.fail.call_args,
122 [("Failed DB Upgrade: mysql-uri not set",)],
123 )
124
125 @patch("charm.MongoUpgrade")
126 @patch("charm.MysqlUpgrade")
127 def test_update_db_mongodb_and_mysql(self, mock_mysql_upgrade, mock_mongo_upgrade):
128 self.harness.update_config({"mongodb-uri": "foo"})
129 self.harness.update_config({"mysql-uri": "foo"})
130 action_event = Mock(
131 params={
132 "current-version": 7,
133 "target-version": 10,
134 "mysql-only": False,
135 "mongodb-only": False,
136 }
137 )
138 self.harness.charm._on_update_db_action(action_event)
139 mock_mysql_upgrade().upgrade.assert_called_once()
140 mock_mongo_upgrade().upgrade.assert_called_once()
141
142 @patch("charm.MongoUpgrade")
143 def test_apply_patch(self, mock_mongo_upgrade):
144 self.harness.update_config({"mongodb-uri": "foo"})
145 action_event = Mock(
146 params={
147 "bug-number": 57,
148 }
149 )
150 self.harness.charm._on_apply_patch_action(action_event)
151 mock_mongo_upgrade().apply_patch.assert_called_once()
152
153 @patch("charm.MongoUpgrade")
154 def test_apply_patch_fail(self, mock_mongo_upgrade):
155 action_event = Mock(
156 params={
157 "bug-number": 57,
158 }
159 )
160 self.harness.charm._on_apply_patch_action(action_event)
161 mock_mongo_upgrade.assert_not_called()
162 self.assertEqual(
163 action_event.fail.call_args,
164 [("Failed Patch Application: mongo-uri not set",)],
165 )