blob: 089b6e52d89d98ab0de6ac8e87c154bc0e55c25a [file] [log] [blame]
sousaeducab58cb2020-11-04 18:48:17 +00001#!/usr/bin/env python3
David Garcia49379ce2021-02-24 13:48:22 +01002# Copyright 2021 Canonical Ltd.
sousaeducab58cb2020-11-04 18:48:17 +00003#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15#
16# For those usages not covered by the Apache License, Version 2.0 please
17# contact: legal@canonical.com
18#
19# To get in touch with the maintainers, please contact:
20# osm-charmers@lists.launchpad.net
21##
22
David Garcia49379ce2021-02-24 13:48:22 +010023import sys
sousaeducab58cb2020-11-04 18:48:17 +000024from typing import NoReturn
25import unittest
sousaeducab58cb2020-11-04 18:48:17 +000026
27from charm import PolCharm
David Garciac753dc52021-03-17 15:28:47 +010028from ops.model import ActiveStatus, BlockedStatus
29from ops.testing import Harness
sousaeducab58cb2020-11-04 18:48:17 +000030
31
32class TestCharm(unittest.TestCase):
David Garcia49379ce2021-02-24 13:48:22 +010033 """Pol Charm unit tests."""
sousaeducab58cb2020-11-04 18:48:17 +000034
35 def setUp(self) -> NoReturn:
36 """Test setup"""
David Garcia49379ce2021-02-24 13:48:22 +010037 self.image_info = sys.modules["oci_image"].OCIImageResource().fetch()
sousaeducab58cb2020-11-04 18:48:17 +000038 self.harness = Harness(PolCharm)
39 self.harness.set_leader(is_leader=True)
40 self.harness.begin()
David Garcia49379ce2021-02-24 13:48:22 +010041 self.config = {
42 "log_level": "INFO",
sousaedu996a5602021-05-03 00:22:43 +020043 "mongodb_uri": "",
sousaeducab58cb2020-11-04 18:48:17 +000044 }
David Garcia49379ce2021-02-24 13:48:22 +010045 self.harness.update_config(self.config)
sousaeducab58cb2020-11-04 18:48:17 +000046
David Garcia49379ce2021-02-24 13:48:22 +010047 def test_config_changed_no_relations(
48 self,
49 ) -> NoReturn:
50 """Test ingress resources without HTTP."""
sousaeducab58cb2020-11-04 18:48:17 +000051
David Garcia49379ce2021-02-24 13:48:22 +010052 self.harness.charm.on.config_changed.emit()
sousaeducab58cb2020-11-04 18:48:17 +000053
David Garcia49379ce2021-02-24 13:48:22 +010054 # Assertions
55 self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
56 self.assertTrue(
57 all(
58 relation in self.harness.charm.unit.status.message
59 for relation in ["mongodb", "kafka"]
60 )
61 )
sousaeducab58cb2020-11-04 18:48:17 +000062
David Garcia49379ce2021-02-24 13:48:22 +010063 def test_config_changed_non_leader(
64 self,
65 ) -> NoReturn:
66 """Test ingress resources without HTTP."""
67 self.harness.set_leader(is_leader=False)
68 self.harness.charm.on.config_changed.emit()
69
70 # Assertions
71 self.assertIsInstance(self.harness.charm.unit.status, ActiveStatus)
72
sousaedu996a5602021-05-03 00:22:43 +020073 def test_with_relations_and_mongodb_config(
74 self,
75 ) -> NoReturn:
76 "Test with relations and mongodb config (internal)"
77 self.initialize_kafka_relation()
78 self.initialize_mongo_config()
79 # Verifying status
80 self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
81
David Garcia49379ce2021-02-24 13:48:22 +010082 def test_with_relations(
83 self,
84 ) -> NoReturn:
85 "Test with relations (internal)"
86 self.initialize_kafka_relation()
87 self.initialize_mongo_relation()
88 # Verifying status
89 self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
90
sousaedu996a5602021-05-03 00:22:43 +020091 def test_exception_mongodb_relation_and_config(
92 self,
93 ) -> NoReturn:
94 "Test with relation and config for Mongodb. Must fail"
95 self.initialize_mongo_relation()
96 self.initialize_mongo_config()
97 # Verifying status
98 self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
99
David Garcia49379ce2021-02-24 13:48:22 +0100100 def initialize_kafka_relation(self):
sousaeducab58cb2020-11-04 18:48:17 +0000101 kafka_relation_id = self.harness.add_relation("kafka", "kafka")
102 self.harness.add_relation_unit(kafka_relation_id, "kafka/0")
103 self.harness.update_relation_data(
104 kafka_relation_id, "kafka/0", {"host": "kafka", "port": 9092}
105 )
106
sousaedu996a5602021-05-03 00:22:43 +0200107 def initialize_mongo_config(self):
108 self.harness.update_config({"mongodb_uri": "mongodb://mongo:27017"})
109
David Garcia49379ce2021-02-24 13:48:22 +0100110 def initialize_mongo_relation(self):
sousaeducab58cb2020-11-04 18:48:17 +0000111 mongodb_relation_id = self.harness.add_relation("mongodb", "mongodb")
112 self.harness.add_relation_unit(mongodb_relation_id, "mongodb/0")
113 self.harness.update_relation_data(
114 mongodb_relation_id,
115 "mongodb/0",
116 {"connection_string": "mongodb://mongo:27017"},
117 )
118
sousaeducab58cb2020-11-04 18:48:17 +0000119
120if __name__ == "__main__":
121 unittest.main()
David Garcia49379ce2021-02-24 13:48:22 +0100122
123
124# class TestCharm(unittest.TestCase):
125# """POL Charm unit tests."""
126
127# def setUp(self) -> NoReturn:
128# """Test setup"""
129# self.harness = Harness(PolCharm)
130# self.harness.set_leader(is_leader=True)
131# self.harness.begin()
132
133# def test_on_start_without_relations(self) -> NoReturn:
134# """Test installation without any relation."""
135# self.harness.charm.on.start.emit()
136
137# # Verifying status
138# self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
139
140# # Verifying status message
141# self.assertGreater(len(self.harness.charm.unit.status.message), 0)
142# self.assertTrue(
143# self.harness.charm.unit.status.message.startswith("Waiting for ")
144# )
145# self.assertIn("kafka", self.harness.charm.unit.status.message)
146# self.assertIn("mongodb", self.harness.charm.unit.status.message)
147# self.assertTrue(self.harness.charm.unit.status.message.endswith(" relations"))
148
149# def test_on_start_with_relations(self) -> NoReturn:
150# """Test deployment without keystone."""
151# expected_result = {
152# "version": 3,
153# "containers": [
154# {
155# "name": "pol",
156# "imageDetails": self.harness.charm.image.fetch(),
157# "imagePullPolicy": "Always",
158# "ports": [
159# {
160# "name": "pol",
161# "containerPort": 80,
162# "protocol": "TCP",
163# }
164# ],
165# "envConfig": {
166# "ALLOW_ANONYMOUS_LOGIN": "yes",
167# "OSMPOL_GLOBAL_LOGLEVEL": "INFO",
168# "OSMPOL_MESSAGE_HOST": "kafka",
169# "OSMPOL_MESSAGE_DRIVER": "kafka",
170# "OSMPOL_MESSAGE_PORT": 9092,
171# "OSMPOL_DATABASE_DRIVER": "mongo",
172# "OSMPOL_DATABASE_URI": "mongodb://mongo:27017",
173# },
174# }
175# ],
176# "kubernetesResources": {"ingressResources": []},
177# }
178
179# self.harness.charm.on.start.emit()
180
181# # Check if kafka datastore is initialized
182# self.assertIsNone(self.harness.charm.state.message_host)
183# self.assertIsNone(self.harness.charm.state.message_port)
184
185# # Check if mongodb datastore is initialized
186# self.assertIsNone(self.harness.charm.state.database_uri)
187
188# # Initializing the kafka relation
189# kafka_relation_id = self.harness.add_relation("kafka", "kafka")
190# self.harness.add_relation_unit(kafka_relation_id, "kafka/0")
191# self.harness.update_relation_data(
192# kafka_relation_id, "kafka/0", {"host": "kafka", "port": 9092}
193# )
194
195# # Initializing the mongo relation
196# mongodb_relation_id = self.harness.add_relation("mongodb", "mongodb")
197# self.harness.add_relation_unit(mongodb_relation_id, "mongodb/0")
198# self.harness.update_relation_data(
199# mongodb_relation_id,
200# "mongodb/0",
201# {"connection_string": "mongodb://mongo:27017"},
202# )
203
204# # Checking if kafka data is stored
205# self.assertEqual(self.harness.charm.state.message_host, "kafka")
206# self.assertEqual(self.harness.charm.state.message_port, 9092)
207
208# # Checking if mongodb data is stored
209# self.assertEqual(self.harness.charm.state.database_uri, "mongodb://mongo:27017")
210
211# # Verifying status
212# self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus)
213
214# pod_spec, _ = self.harness.get_pod_spec()
215
216# self.assertDictEqual(expected_result, pod_spec)
217
218# def test_on_kafka_unit_relation_changed(self) -> NoReturn:
219# """Test to see if kafka relation is updated."""
220# self.harness.charm.on.start.emit()
221
222# self.assertIsNone(self.harness.charm.state.message_host)
223# self.assertIsNone(self.harness.charm.state.message_port)
224
225# relation_id = self.harness.add_relation("kafka", "kafka")
226# self.harness.add_relation_unit(relation_id, "kafka/0")
227# self.harness.update_relation_data(
228# relation_id, "kafka/0", {"host": "kafka", "port": 9092}
229# )
230
231# self.assertEqual(self.harness.charm.state.message_host, "kafka")
232# self.assertEqual(self.harness.charm.state.message_port, 9092)
233
234# # Verifying status
235# self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
236
237# # Verifying status message
238# self.assertGreater(len(self.harness.charm.unit.status.message), 0)
239# self.assertTrue(
240# self.harness.charm.unit.status.message.startswith("Waiting for ")
241# )
242# self.assertNotIn("kafka", self.harness.charm.unit.status.message)
243# self.assertIn("mongodb", self.harness.charm.unit.status.message)
244# self.assertTrue(self.harness.charm.unit.status.message.endswith(" relation"))
245
246# def test_on_mongodb_unit_relation_changed(self) -> NoReturn:
247# """Test to see if mongodb relation is updated."""
248# self.harness.charm.on.start.emit()
249
250# self.assertIsNone(self.harness.charm.state.database_uri)
251
252# relation_id = self.harness.add_relation("mongodb", "mongodb")
253# self.harness.add_relation_unit(relation_id, "mongodb/0")
254# self.harness.update_relation_data(
255# relation_id, "mongodb/0", {"connection_string": "mongodb://mongo:27017"}
256# )
257
258# self.assertEqual(self.harness.charm.state.database_uri, "mongodb://mongo:27017")
259
260# # Verifying status
261# self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus)
262
263# # Verifying status message
264# self.assertGreater(len(self.harness.charm.unit.status.message), 0)
265# self.assertTrue(
266# self.harness.charm.unit.status.message.startswith("Waiting for ")
267# )
268# self.assertIn("kafka", self.harness.charm.unit.status.message)
269# self.assertNotIn("mongodb", self.harness.charm.unit.status.message)
270# self.assertTrue(self.harness.charm.unit.status.message.endswith(" relation"))
271
272
273# if __name__ == "__main__":
274# unittest.main()