Add unit testing + corrected config validation

Change-Id: I141c052ab7eb054f52011d535ea37114e7367ebe
Related-bug: PROD-24880 (PROD:24880)
diff --git a/run-tests.sh b/run-tests.sh
index ba1f8ce..09f844a 100755
--- a/run-tests.sh
+++ b/run-tests.sh
@@ -1,4 +1,6 @@
 #!/bin/bash -x
 set -e
 
+pytest -v
+
 exit 0
diff --git a/sf_notifier/salesforce/client.py b/sf_notifier/salesforce/client.py
index 84fc0b4..84e68cb 100644
--- a/sf_notifier/salesforce/client.py
+++ b/sf_notifier/salesforce/client.py
@@ -60,9 +60,7 @@
 
 
 class SfNotifierError(Exception):
-    def __init__(self, message, errors):
-        super(SfNotifierError, self).__init__(message)
-        self.errors = errors
+    pass
 
 
 class SalesforceClient(object):
@@ -74,17 +72,21 @@
         self._auth()
         self._registered_alerts = {}
 
-    def _validate_config(self, config):
-        kwargs = {'session': self.session}
+    @staticmethod
+    def _validate_config(config):
+        kwargs = {}
 
         for param, field in CONFIG_FIELD_MAP.iteritems():
             setting_var = param.upper()
             env_var = 'SFDC_{}'.format(setting_var)
             kwargs[field] = os.environ.get(
-                env_var, getattr(config, setting_var, None))
+                env_var, config.get(setting_var))
 
             if field == 'domain':
-                kwargs[field] = kwargs[field] and 'test'
+                if kwargs[field] is True:
+                    kwargs[field] = 'test'
+                else:
+                    del kwargs[field]
                 continue
 
             if kwargs[field] is None:
@@ -95,10 +97,13 @@
         return kwargs
 
     def _auth(self):
-        self.sf = Salesforce(**self.config)
+        kwargs = {'session': self.session}
+        kwargs.update(self.config)
+        self.sf = Salesforce(**kwargs)
         logger.info('Salesforce authentication successful.')
 
-    def _get_alert_id(self, labels):
+    @staticmethod
+    def _get_alert_id(labels):
         alert_id_data = ''
         for key in sorted(labels):
             alert_id_data += labels[key].replace(".", "\\.")
diff --git a/sf_notifier/tests/__init__.py b/sf_notifier/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sf_notifier/tests/__init__.py
diff --git a/sf_notifier/tests/test_client.py b/sf_notifier/tests/test_client.py
new file mode 100644
index 0000000..b62eaa0
--- /dev/null
+++ b/sf_notifier/tests/test_client.py
@@ -0,0 +1,115 @@
+import os
+
+import pytest
+
+from sf_notifier.salesforce.client import SalesforceClient, SfNotifierError
+
+
+ENV_VARS = [
+    'SFDC_AUTH_URL',
+    'SFDC_USERNAME',
+    'SFDC_PASSWORD',
+    'SFDC_ORGANIZATION_ID',
+    'SFDC_ENVIRONMENT_ID',
+    'SFDC_SANDBOX_ENABLED'
+]
+
+
+def unset_env_vars():
+    for v in ENV_VARS:
+        if os.environ.get(v):
+            del os.environ[v]
+
+
+def test_validate_config():
+    OK_CONFIG_1 = [
+        {
+            'AUTH_URL': 'instance_xxx',
+            'USERNAME': 'username_xxx',
+            'PASSWORD': 'password_xxx',
+            'ORGANIZATION_ID': 'org_xxx',
+            'ENVIRONMENT_ID': 'env_xxx',
+            'SANDBOX_ENABLED': True
+        },
+        {
+            'instance': 'instance_xxx',
+            'username': 'username_xxx',
+            'password': 'password_xxx',
+            'organizationId': 'org_xxx',
+            'environment_id': 'env_xxx',
+            'domain': 'test'
+        }
+    ]
+    OK_CONFIG_2 = [
+        {
+            'AUTH_URL': 'instance_xxx',
+            'USERNAME': 'username_xxx',
+            'PASSWORD': 'password_xxx',
+            'ORGANIZATION_ID': 'org_xxx',
+            'ENVIRONMENT_ID': 'env_xxx'
+        },
+        {
+            'instance': 'instance_xxx',
+            'username': 'username_xxx',
+            'password': 'password_xxx',
+            'organizationId': 'org_xxx',
+            'environment_id': 'env_xxx'
+        }
+    ]
+    WRONG_CONFIG = {
+        'AUTH_URL': 'xxx',
+        'USERNAME': 'xxx',
+        'PASSWORD': 'xxx',
+        'ORGANIZATION_ID': 'xxx',
+        'SANDBOX_ENABLED': True
+    }
+
+    unset_env_vars()
+
+    assert SalesforceClient._validate_config(OK_CONFIG_1[0]) == OK_CONFIG_1[1]
+    assert SalesforceClient._validate_config(OK_CONFIG_2[0]) == OK_CONFIG_2[1]
+    pytest.raises(SfNotifierError,
+                  SalesforceClient._validate_config, WRONG_CONFIG)
+
+
+def test_alert_id_generate():
+    LABELS = {
+        'alertname': 'ApacheServiceDown',
+        'environment': 'testing_env',
+        'host': 'mdb01',
+        'instance': 'mdb01;telegraf',
+        'job': 'telegraf',
+        'region': 'region1',
+        'route': 'email,salesforce',
+        'service': 'apache',
+        'severity': 'minor'
+    }
+    SAME_LABELS = {
+        'environment': 'testing_env',
+        'service': 'apache',
+        'route': 'email,salesforce',
+        'instance': 'mdb01;telegraf',
+        'host': 'mdb01',
+        'severity': 'minor',
+        'region': 'region1',
+        'alertname': 'ApacheServiceDown',
+        'job': 'telegraf'
+    }
+    DIFF_LABELS = {
+        'environment': 'testing_env',
+        'service': 'apache',
+        'route': 'email,salesforce',
+        'instance': 'mdb01;telegraf',
+        'host': 'mdb01',
+        'severity': 'minor',
+        'region': 'region1',
+        'alertname': 'ApacheServiceDow',
+        'job': 'telegraf'
+    }
+
+    unset_env_vars()
+
+    alert_id = SalesforceClient._get_alert_id(LABELS)
+
+    assert alert_id == SalesforceClient._get_alert_id(SAME_LABELS)
+    assert alert_id != SalesforceClient._get_alert_id(DIFF_LABELS)
diff --git a/test-requirements.txt b/test-requirements.txt
index 05c2b98..de162a9 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -6,4 +6,5 @@
 flake8-import-order>=0.17.1 #LGPLv3
 bandit>=1.1.0 # Apache-2.0
 sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD
-
+pytest==4.0.1
+pytest-mock==1.10.0