Fix Dockerfile.local
[osm/NBI.git] / osm_nbi / tests / test_admin_topics.py
index dce8710..74528f8 100755 (executable)
@@ -19,14 +19,20 @@ __date__ = "$2019-10-019"
 
 import unittest
 from unittest import TestCase
-from unittest.mock import Mock
+from unittest.mock import Mock, patch, call
 from uuid import uuid4
 from http import HTTPStatus
 from time import time
 from random import randint
 from osm_common import dbbase, fsbase, msgbase
 from osm_nbi import authconn, validation
-from osm_nbi.admin_topics import ProjectTopicAuth, RoleTopicAuth, UserTopicAuth, CommonVimWimSdn
+from osm_nbi.admin_topics import (
+    ProjectTopicAuth,
+    RoleTopicAuth,
+    UserTopicAuth,
+    CommonVimWimSdn,
+    VcaTopic,
+)
 from osm_nbi.engine import EngineException
 from osm_nbi.authconn import AuthconnNotFoundException
 
@@ -40,6 +46,125 @@ def norm(str):
     return ' '.join(str.strip().split()).lower()
 
 
+class TestVcaTopic(TestCase):
+    def setUp(self):
+        self.db = Mock(dbbase.DbBase())
+        self.fs = Mock(fsbase.FsBase())
+        self.msg = Mock(msgbase.MsgBase())
+        self.auth = Mock(authconn.Authconn(None, None, None))
+        self.vca_topic = VcaTopic(self.db, self.fs, self.msg, self.auth)
+
+    @patch("osm_nbi.admin_topics.CommonVimWimSdn.format_on_new")
+    def test_format_on_new(self, mock_super_format_on_new):
+        content = {
+            "_id": "id",
+            "secret": "encrypted_secret",
+            "cacert": "encrypted_cacert",
+        }
+        self.db.encrypt.side_effect = ["secret", "cacert"]
+        mock_super_format_on_new.return_value = "1234"
+
+        oid = self.vca_topic.format_on_new(content)
+
+        self.assertEqual(oid, "1234")
+        self.assertEqual(content["secret"], "secret")
+        self.assertEqual(content["cacert"], "cacert")
+        self.db.encrypt.assert_has_calls(
+            [
+                call("encrypted_secret", schema_version="1.11", salt="id"),
+                call("encrypted_cacert", schema_version="1.11", salt="id"),
+            ]
+        )
+        mock_super_format_on_new.assert_called_with(content, None, False)
+
+    @patch("osm_nbi.admin_topics.CommonVimWimSdn.format_on_edit")
+    def test_format_on_edit(self, mock_super_format_on_edit):
+        edit_content = {
+            "_id": "id",
+            "secret": "encrypted_secret",
+            "cacert": "encrypted_cacert",
+        }
+        final_content = {
+            "_id": "id",
+            "schema_version": "1.11",
+        }
+        self.db.encrypt.side_effect = ["secret", "cacert"]
+        mock_super_format_on_edit.return_value = "1234"
+
+        oid = self.vca_topic.format_on_edit(final_content, edit_content)
+
+        self.assertEqual(oid, "1234")
+        self.assertEqual(final_content["secret"], "secret")
+        self.assertEqual(final_content["cacert"], "cacert")
+        self.db.encrypt.assert_has_calls(
+            [
+                call("encrypted_secret", schema_version="1.11", salt="id"),
+                call("encrypted_cacert", schema_version="1.11", salt="id"),
+            ]
+        )
+        mock_super_format_on_edit.assert_called()
+
+    @patch("osm_nbi.admin_topics.CommonVimWimSdn.check_conflict_on_del")
+    def test_check_conflict_on_del(self, mock_check_conflict_on_del):
+        session = {
+            "project_id": "project-id",
+            "force": False,
+        }
+        _id = "vca-id"
+        db_content = {}
+
+        self.db.get_list.return_value = None
+
+        self.vca_topic.check_conflict_on_del(session, _id, db_content)
+
+        self.db.get_list.assert_called_with(
+            "vim_accounts",
+            {"vca": _id, '_admin.projects_read.cont': 'project-id'},
+        )
+        mock_check_conflict_on_del.assert_called_with(session, _id, db_content)
+
+    @patch("osm_nbi.admin_topics.CommonVimWimSdn.check_conflict_on_del")
+    def test_check_conflict_on_del_force(self, mock_check_conflict_on_del):
+        session = {
+            "project_id": "project-id",
+            "force": True,
+        }
+        _id = "vca-id"
+        db_content = {}
+
+        self.vca_topic.check_conflict_on_del(session, _id, db_content)
+
+        self.db.get_list.assert_not_called()
+        mock_check_conflict_on_del.assert_not_called()
+
+    @patch("osm_nbi.admin_topics.CommonVimWimSdn.check_conflict_on_del")
+    def test_check_conflict_on_del_with_conflict(self, mock_check_conflict_on_del):
+        session = {
+            "project_id": "project-id",
+            "force": False,
+        }
+        _id = "vca-id"
+        db_content = {}
+
+        self.db.get_list.return_value = {"_id": "vim", "vca": "vca-id"}
+
+        with self.assertRaises(EngineException) as context:
+            self.vca_topic.check_conflict_on_del(session, _id, db_content)
+            self.assertEqual(
+                context.exception,
+                EngineException(
+                    "There is at least one VIM account using this vca",
+                    http_code=HTTPStatus.CONFLICT
+                )
+            )
+
+        self.db.get_list.assert_called_with(
+            "vim_accounts",
+            {"vca": _id, '_admin.projects_read.cont': 'project-id'},
+        )
+        mock_check_conflict_on_del.assert_not_called()
+
+
 class Test_ProjectTopicAuth(TestCase):
 
     @classmethod
@@ -481,6 +606,7 @@ class Test_UserTopicAuth(TestCase):
             new_name = "other-user-name"
             new_prms = [{}]
             self.auth.get_role_list.side_effect = [[user], []]
+            self.auth.get_user_list.side_effect = [[user]]
             with self.assertRaises(EngineException, msg="Accepted wrong project-role mappings") as e:
                 self.topic.edit(self.fake_session, uid, {"username": new_name, "project_role_mappings": new_prms})
             self.assertEqual(e.exception.http_code, HTTPStatus.UNPROCESSABLE_ENTITY, "Wrong HTTP status code")
@@ -698,6 +824,7 @@ class Test_CommonVimWimSdn(TestCase):
             self.assertEqual(operation["detailed-status"], "", "Wrong operation detailed status info")
             self.assertIsNone(operation["operationParams"], "Wrong operation parameters")
         with self.subTest(i=2):
+            self.db.get_one.side_effect = [cvws]
             with self.assertRaises(EngineException, msg="Accepted wrong property") as e:
                 self.topic.edit(self.fake_session, str(uuid4()), {"name": "new-name", "extra_prop": "anything"})
             self.assertEqual(e.exception.http_code, HTTPStatus.UNPROCESSABLE_ENTITY, "Wrong HTTP status code")
@@ -734,8 +861,8 @@ class Test_CommonVimWimSdn(TestCase):
             self.assertEqual(self.db.set_one.call_args[0][1]["_id"], cid, "Wrong CIM identifier")
             self.assertEqual(self.db.set_one.call_args[1]["update_dict"], None,
                              "Wrong read-only projects update")
-            self.assertEqual(self.db.set_one.call_args[1]["pull"], {"_admin.projects_read." + test_pid: None,
-                                                                    "_admin.projects_write." + test_pid: None},
+            self.assertEqual(self.db.set_one.call_args[1]["pull_list"],
+                             {"_admin.projects_read": (test_pid,), "_admin.projects_write": (test_pid,)},
                              "Wrong read/write projects update")
             self.topic._send_msg.assert_not_called()
         with self.subTest(i=2):