From f092d98f9f2eaa83e9490d23b526cf9ae6062976 Mon Sep 17 00:00:00 2001 From: esir Date: Thu, 7 May 2020 15:47:54 +0300 Subject: [PATCH 1/6] Sets up unit tests for Gsheet and twitter helpers --- tests/__init__.py | 0 tests/utils/__init__.py | 0 tests/utils/gsheet/__init__.py | 0 tests/utils/gsheet/test_gsheet_helper.py | 4 ++++ tests/utils/twitter/__init__.py | 0 tests/utils/twitter/test_stream_listener.py | 4 ++++ 6 files changed, 8 insertions(+) create mode 100644 tests/__init__.py create mode 100644 tests/utils/__init__.py create mode 100644 tests/utils/gsheet/__init__.py create mode 100644 tests/utils/gsheet/test_gsheet_helper.py create mode 100644 tests/utils/twitter/__init__.py create mode 100644 tests/utils/twitter/test_stream_listener.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/utils/gsheet/__init__.py b/tests/utils/gsheet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/utils/gsheet/test_gsheet_helper.py b/tests/utils/gsheet/test_gsheet_helper.py new file mode 100644 index 0000000..239e0c4 --- /dev/null +++ b/tests/utils/gsheet/test_gsheet_helper.py @@ -0,0 +1,4 @@ +from django.test import TestCase + +class TestGsheetHelper(TestCase): + pass diff --git a/tests/utils/twitter/__init__.py b/tests/utils/twitter/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/utils/twitter/test_stream_listener.py b/tests/utils/twitter/test_stream_listener.py new file mode 100644 index 0000000..58aceb3 --- /dev/null +++ b/tests/utils/twitter/test_stream_listener.py @@ -0,0 +1,4 @@ +from django.test import TestCase + +class TestTweeterStream(TestCase): + pass From 8413be7ac0c6bf6b4081920bfd08a0d6ebcee72e Mon Sep 17 00:00:00 2001 From: esir Date: Thu, 7 May 2020 17:43:18 +0300 Subject: [PATCH 2/6] Adds unit test for the gsheet helper class --- tests/utils/gsheet/test_gsheet_helper.py | 27 ++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/tests/utils/gsheet/test_gsheet_helper.py b/tests/utils/gsheet/test_gsheet_helper.py index 239e0c4..30f705f 100644 --- a/tests/utils/gsheet/test_gsheet_helper.py +++ b/tests/utils/gsheet/test_gsheet_helper.py @@ -1,4 +1,27 @@ -from django.test import TestCase +from unittest import TestCase +from test.support import EnvironmentVarGuard +from utils.gsheet.helper import GoogleSheetHelper class TestGsheetHelper(TestCase): - pass + def setUp(self): + self.env = EnvironmentVarGuard() + self.env.unset('GOOGLE_CREDENTIALS') + + def test_google_credentials_required(self): + """ + Test to ensure that GOOGLE_CREDENTIALS are always set in the environment variables + while creating a GoogleSheetHelper. + """ + with self.assertRaises(Exception): + GoogleSheetHelper() + + def test_google_credentials_provided_has_required_values(self): + """ + Test to ensure the GOOGLE_CREDENTIALS provided has required values e.g + sheet_name + """ + self.env.set('GOOGLE_CREDENTIALS', "{}") + with self.assertRaises(Exception): + GoogleSheetHelper() + + self.env.set('GOOGLE_CREDENTIALS', "{'sheet_name': '[DUMMY] Fact Check'}") From 5b8503302d077130a8a7fa26ad4167cffbda1585 Mon Sep 17 00:00:00 2001 From: esir Date: Thu, 7 May 2020 17:45:04 +0300 Subject: [PATCH 3/6] Modify the helper class to ensure the unit tests are passing. --- utils/gsheet/helper.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/utils/gsheet/helper.py b/utils/gsheet/helper.py index 17073dc..c7303a8 100644 --- a/utils/gsheet/helper.py +++ b/utils/gsheet/helper.py @@ -18,12 +18,18 @@ def __init__(self) -> None: 'https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive' ] + credentials = os.getenv('GOOGLE_CREDENTIALS') + if not credentials: + raise Exception("GOOGLE_CREDENTIALS must be set as an environment variable.") google_credentials = json.loads( - eval(os.getenv('GOOGLE_CREDENTIALS')), strict=False) + credentials, strict=False) + sheet_name = google_credentials.get('sheet_name') + if not sheet_name: + raise Exception("Sheet name has not been set in the GOOGLE_CREDENTIALS environment variable.") self.__credentials = ServiceAccountCredentials.from_json_keyfile_dict( google_credentials, scopes=self.__scope) self.__client = gspread.authorize(self.__credentials) - self.__sheet_name = google_credentials['sheet_name'] + self.__sheet_name = sheet_name self.__sheet = self.__client.open(self.__sheet_name).sheet1 def open_sheet(self) -> Optional[dict]: From cc6d7c6290f2672dc94098dbc34efba9ba8f2d54 Mon Sep 17 00:00:00 2001 From: esir Date: Fri, 8 May 2020 06:43:10 +0300 Subject: [PATCH 4/6] Adds test to ensure exception is raised incase authorization keys are not set in the environment variables. --- tests/utils/gsheet/test_gsheet_helper.py | 2 +- tests/utils/twitter/test_stream_listener.py | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/utils/gsheet/test_gsheet_helper.py b/tests/utils/gsheet/test_gsheet_helper.py index 30f705f..91f2356 100644 --- a/tests/utils/gsheet/test_gsheet_helper.py +++ b/tests/utils/gsheet/test_gsheet_helper.py @@ -5,7 +5,7 @@ class TestGsheetHelper(TestCase): def setUp(self): self.env = EnvironmentVarGuard() - self.env.unset('GOOGLE_CREDENTIALS') + self.env.clear() def test_google_credentials_required(self): """ diff --git a/tests/utils/twitter/test_stream_listener.py b/tests/utils/twitter/test_stream_listener.py index 58aceb3..3b21ca6 100644 --- a/tests/utils/twitter/test_stream_listener.py +++ b/tests/utils/twitter/test_stream_listener.py @@ -1,4 +1,20 @@ from django.test import TestCase +from test.support import EnvironmentVarGuard + +from utils.twitter.stream_listener import Listener + class TestTweeterStream(TestCase): - pass + def setUp(self): + self.env = EnvironmentVarGuard() + self.env.clear() + + def test_keys_required_for_twitter_authorization_are_provided(self): + """ + Test to ensure that keys required for twitter authoization i.e + CLIENT_KEY, CLIENT_SECRET, ACCESS_TOKEN and ACCESS_SECRET + are always set in the environment variables + while creating a StreamListener. + """ + with self.assertRaises(Exception): + Listener() From c77252096a1f9c293b40f0e75e9d88325a0c196f Mon Sep 17 00:00:00 2001 From: esir Date: Fri, 8 May 2020 06:53:51 +0300 Subject: [PATCH 5/6] Raise ValueErrors instead of general Exceptions --- tests/utils/gsheet/test_gsheet_helper.py | 6 ++---- tests/utils/twitter/test_stream_listener.py | 4 ++-- utils/gsheet/helper.py | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/tests/utils/gsheet/test_gsheet_helper.py b/tests/utils/gsheet/test_gsheet_helper.py index 91f2356..251c8f4 100644 --- a/tests/utils/gsheet/test_gsheet_helper.py +++ b/tests/utils/gsheet/test_gsheet_helper.py @@ -12,7 +12,7 @@ def test_google_credentials_required(self): Test to ensure that GOOGLE_CREDENTIALS are always set in the environment variables while creating a GoogleSheetHelper. """ - with self.assertRaises(Exception): + with self.assertRaises(ValueError): GoogleSheetHelper() def test_google_credentials_provided_has_required_values(self): @@ -21,7 +21,5 @@ def test_google_credentials_provided_has_required_values(self): sheet_name """ self.env.set('GOOGLE_CREDENTIALS', "{}") - with self.assertRaises(Exception): + with self.assertRaises(ValueError): GoogleSheetHelper() - - self.env.set('GOOGLE_CREDENTIALS', "{'sheet_name': '[DUMMY] Fact Check'}") diff --git a/tests/utils/twitter/test_stream_listener.py b/tests/utils/twitter/test_stream_listener.py index 3b21ca6..a347788 100644 --- a/tests/utils/twitter/test_stream_listener.py +++ b/tests/utils/twitter/test_stream_listener.py @@ -1,4 +1,4 @@ -from django.test import TestCase +from unittest import TestCase from test.support import EnvironmentVarGuard from utils.twitter.stream_listener import Listener @@ -16,5 +16,5 @@ def test_keys_required_for_twitter_authorization_are_provided(self): are always set in the environment variables while creating a StreamListener. """ - with self.assertRaises(Exception): + with self.assertRaises(ValueError): Listener() diff --git a/utils/gsheet/helper.py b/utils/gsheet/helper.py index c7303a8..2ccc4d3 100644 --- a/utils/gsheet/helper.py +++ b/utils/gsheet/helper.py @@ -20,12 +20,12 @@ def __init__(self) -> None: ] credentials = os.getenv('GOOGLE_CREDENTIALS') if not credentials: - raise Exception("GOOGLE_CREDENTIALS must be set as an environment variable.") + raise ValueError("GOOGLE_CREDENTIALS must be set as an environment variable.") google_credentials = json.loads( credentials, strict=False) sheet_name = google_credentials.get('sheet_name') if not sheet_name: - raise Exception("Sheet name has not been set in the GOOGLE_CREDENTIALS environment variable.") + raise ValueError("Sheet name has not been set in the GOOGLE_CREDENTIALS environment variable.") self.__credentials = ServiceAccountCredentials.from_json_keyfile_dict( google_credentials, scopes=self.__scope) self.__client = gspread.authorize(self.__credentials) From 2e6f89fda221b012dd5c1cc8dd151ea103632227 Mon Sep 17 00:00:00 2001 From: esir Date: Fri, 8 May 2020 06:55:16 +0300 Subject: [PATCH 6/6] Adds checks to ensure required environment variables are always set --- utils/twitter/stream_listener.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/utils/twitter/stream_listener.py b/utils/twitter/stream_listener.py index 6abc860..5650375 100644 --- a/utils/twitter/stream_listener.py +++ b/utils/twitter/stream_listener.py @@ -11,8 +11,21 @@ class Listener(StreamListener): def __init__(self): super(Listener, self).__init__() - self.__auth = OAuthHandler(os.getenv('CLIENT_KEY'), os.getenv('CLIENT_SECRET')) # type: OAuthHandler - self.__auth.set_access_token(os.getenv('ACCESS_TOKEN'), os.getenv('ACCESS_SECRET')) + client_key = os.getenv('CLIENT_KEY') + client_secret = os.getenv('CLIENT_SECRET') + access_token = os.getenv('ACCESS_TOKEN') + access_secret = os.getenv('ACCESS_SECRET') + + if not client_key: + raise ValueError("CLIENT_KEY not set as an environment variable.") + if not client_secret: + raise ValueError("CLIENT_SECRET not set as an environment variable.") + if not access_token: + raise ValueError("ACCESS_TOKEN not set as an environment variable.") + if not access_secret: + raise ValueError("ACCESS_SECRET not set as an environment variable.") + self.__auth = OAuthHandler(client_key, client_secret) # type: OAuthHandler + self.__auth.set_access_token(access_token, access_secret) self.__stream = [] # type: list @property