From 397a9c640c872e4cc2079b147dcded65d3ed68f5 Mon Sep 17 00:00:00 2001
From: samueltwum1 <samueltwum1@gmail.com>
Date: Thu, 17 Sep 2020 18:08:03 +0200
Subject: [PATCH] SAR-149 Resolve some review comments

- Pass parameters as a keyword argument to transaction
- Fix test to reflect change to transaction module
---
 src/ska/logging/transactions.py | 22 ++++++++------------
 tests/test_transactions.py      | 36 ++++++++++++++-------------------
 2 files changed, 23 insertions(+), 35 deletions(-)

diff --git a/src/ska/logging/transactions.py b/src/ska/logging/transactions.py
index 670e53e..5a1bbd4 100644
--- a/src/ska/logging/transactions.py
+++ b/src/ska/logging/transactions.py
@@ -5,7 +5,7 @@ import json
 import logging
 import os
 
-from typing import Mapping, Text
+from typing import Text
 
 from ska.skuid.client import SkuidClient
 
@@ -31,15 +31,13 @@ class Transaction:
 
      """
 
-    def __init__(self, name, params, logger=None):
-        if not isinstance(params, Mapping):
-            raise TransactionParamsError("params must be dict-like (Mapping)")
-        self.logger = logger
-        if not logger:
-            self.logger = logging.getLogger(__name__)
+    def __init__(self, name, **params):
+        # TODO: get the logger from the transaction logginh application without passing to 
+        # context handler see https://gitlab.com/ska-telescope/ska-logging/-/merge_requests/7#note_414359589
+        self.logger = logging.getLogger(__name__)
         self._name = name
         self._params = params
-        self.transaction_id = self._get_existing_transaction_id() or self._generate_new_id()
+        self.transaction_id = self._get_new_or_existing_transaction_id()
 
     def __enter__(self):
         params_json = json.dumps(self._params)
@@ -56,10 +54,10 @@ class Transaction:
         if exc_type:
             raise
 
-    def _get_existing_transaction_id(self):
+    def _get_new_or_existing_transaction_id(self):
         transaction_id = self._params.get("transaction_id")
         if not self._is_valid_id(transaction_id):
-            transaction_id = None
+            transaction_id = self._generate_new_id()
         return transaction_id
 
     def _is_valid_id(self, transaction_id):
@@ -87,7 +85,3 @@ class TransactionIdGenerator:
 
     def next(self):
         return self._get_id()
-
-
-class TransactionParamsError(TypeError):
-    """Invalid data type for transaction parameters."""
diff --git a/tests/test_transactions.py b/tests/test_transactions.py
index 825713b..e29b5c6 100644
--- a/tests/test_transactions.py
+++ b/tests/test_transactions.py
@@ -10,7 +10,7 @@ import concurrent.futures
 from unittest.mock import patch, MagicMock
 
 from ska.logging import transaction
-from ska.logging.transactions import TransactionParamsError, TransactionIdGenerator
+from ska.logging.transactions import TransactionIdGenerator
 from tests.conftest import (
     get_first_record_and_log_message,
     get_last_record_and_log_message,
@@ -23,62 +23,56 @@ class TestTransactionIdGeneration:
 
     def test_existing_valid_id_is_reused(self, id_generator_stub):
         parameters = {"transaction_id": "abc1234", "other": "config"}
-        with transaction("name", parameters) as transaction_id:
+        with transaction("name", **parameters) as transaction_id:
             assert transaction_id == "abc1234"
 
     def test_new_id_generated_if_id_is_empty(self, id_generator_stub):
         parameters = {"transaction_id": "", "other": "config"}
-        with transaction("name", parameters) as transaction_id:
+        with transaction("name", **parameters) as transaction_id:
             assert transaction_id == id_generator_stub.last_id
 
     def test_new_id_generated_if_id_is_none(self, id_generator_stub):
         parameters = {"transaction_id": None, "other": "config"}
-        with transaction("name", parameters) as transaction_id:
+        with transaction("name", **parameters) as transaction_id:
             assert transaction_id == id_generator_stub.last_id
 
     def test_new_id_generated_if_id_is_only_white_space(self, id_generator_stub):
         parameters = {"transaction_id": "\t\n \r\n", "other": "config"}
-        with transaction("name", parameters) as transaction_id:
+        with transaction("name", **parameters) as transaction_id:
             assert transaction_id == id_generator_stub.last_id
 
     def test_new_id_generated_if_id_is_not_string_type(self, id_generator_stub):
         parameters = {"transaction_id": 1234.5, "other": "config"}
-        with transaction("name", parameters) as transaction_id:
+        with transaction("name", **parameters) as transaction_id:
             assert transaction_id == id_generator_stub.last_id
 
     def test_new_id_generated_if_id_is_not_present(self, id_generator_stub):
         parameters = {"other": "config"}
-        with transaction("name", parameters) as transaction_id:
+        with transaction("name", **parameters) as transaction_id:
             assert transaction_id == id_generator_stub.last_id
 
     def test_new_id_generated_if_params_empty(self, id_generator_stub):
         parameters = {}
-        with transaction("name", parameters) as transaction_id:
+        with transaction("name", **parameters) as transaction_id:
             assert transaction_id == id_generator_stub.last_id
 
     def test_id_provider_only_used_once_for_one_new_id(self, id_generator_stub):
         parameters = {}
-        with transaction("name", parameters):
+        with transaction("name", **parameters):
             assert id_generator_stub.call_count == 1
 
     def test_id_provider_not_used_for_existing_valid_id(self, id_generator_stub):
         parameters = {"transaction_id": "abc1234"}
-        with transaction("name", parameters):
+        with transaction("name", **parameters):
             assert id_generator_stub.call_count == 0
 
-    def test_error_if_params_type_is_not_mapping(self):
-        parameters = []
-        with pytest.raises(TransactionParamsError):
-            with transaction("name", parameters):
-                pass
-
 
 class TestTransactionLogging:
     """Tests for :class:`~ska.logging.transaction` related to logging."""
 
     def test_name_and_id_and_params_in_context_handler(self, id_generator_stub, recording_logger):
-        params = {"other": ["config", 1, 2, 3.0]}
-        with transaction("name", params) as transaction_id:
+        parameters = {"other": ["config", 1, 2, 3.0]}
+        with transaction("name", **parameters) as transaction_id:
             pass
         _, first_log_message = get_first_record_and_log_message(recording_logger)
         _, last_log_message = get_last_record_and_log_message(recording_logger)
@@ -87,7 +81,7 @@ class TestTransactionLogging:
         assert "Start transaction" in first_log_message
         assert "name" in first_log_message
         assert transaction_id in first_log_message
-        assert json.dumps(params) in first_log_message
+        assert json.dumps(parameters) in first_log_message
 
         # __exit__ log message
         assert "Exit transaction" in last_log_message
@@ -95,9 +89,9 @@ class TestTransactionLogging:
         assert transaction_id in last_log_message
 
     def test_exception_logs_transaction_id_and_command(self, id_generator_stub, recording_logger):
-        params = {"other": ["config", 1, 2, 3.0]}
+        parameters = {"other": ["config", 1, 2, 3.0]}
         with pytest.raises(RuntimeError):
-            with transaction("name", params) as transaction_id:
+            with transaction("name", **parameters) as transaction_id:
                 raise RuntimeError("Something went wrong")
 
         record_logs = get_all_record_logs(recording_logger)
-- 
GitLab