From 4f0ecb5a4e70e41819df69d1b8bc6a1df95af2fd Mon Sep 17 00:00:00 2001 From: Akshit Agrawal Date: Thu, 28 Dec 2023 10:29:33 +0530 Subject: [PATCH] tests added --- __pycache__/main.cpython-312.pyc | Bin 0 -> 2526 bytes main.py | 96 ++++++++++++++++-------------- tests.py | 97 +++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 44 deletions(-) create mode 100644 __pycache__/main.cpython-312.pyc create mode 100644 tests.py diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc47484a2ab757cf8179e45c173daaf635eda4cf GIT binary patch literal 2526 zcma)7O>EOv9Dk0T#z~#hq@PKFrmzB0i49t|LN`Diw52eTk^mKDQ)KeoG;I<`wgV(` zw|3ejkPsiIA|a%1r%qgY>~YdIcG$%vo#?zCkk-SvMe7bzci5ht*y+kgd6M6I{(t=b zAHRQ`pPfzzKA6 zWMbAK;}vhwDig23p=utl!LiP^Y|2;TXUmeUH4HnD>J9ZIW!!3K0zl_CCTo)oHH~qD z4O6{nUg{;6DcND*e}UP73?2g5C}U`MJtC&->;Sr96Ks|(um#oHDiaBE+VE9JnT_Yb~92ySAPM+?MT!@AG&kd-} z{}Wvrh(w3Op@Q`=eTY7!wpNv=!Y9uTL}HPFq2cI-$mK$tz$KERB;@Id+*KO#@hMKA z<9vFn!^P-8M31rsXrw3wVlB8Mz1ir0Ao`U#bo;8JPTmSy8pY=SE^1p<)Eav8{F;`u-> z3t5TVz-U4HJ{8&r*<^}?K8Z&Nx_u>d*9I0S5VVvi2-@#TC5`%3Yl=@KGX+Z^hn{Sq zu?CO>Y6DJCFd_395FdGGL>$8%{eBZ&+Y_zV}&00J7RfeK>4AcIM> z$qb#%t4{3_8_#9pTG7IO6h!+g75_lPGXvIKO>>_69;JgWxtN(VtIe%*!}o`k-ND5~ zsrmTKxwY2zx#a!i3h7h!e6WsVZO3N9f7O9DPgSak_RNH9W>o>QaW`*9eond-()(a? z;iKYidX;o44L!@`!BvvFdH%NTIoYO=o%1J@y?sl(az0u-9#uximC00bG^N`fStgH~ zwg_nVD(SdO-XiaLm&u)F!fI_?rCRTXZiR{+XG+xBXVj&q)Fox?N|Cy<>h4f>zF%_p zDpYS72hLBhG6g()@5%Fr=RchfF9wyCBQv2gVY4=_csl333!{ttif7k@&libBzKmm@ zA?&7et%CmGSc&pKqk>PV;1X7(j_TNS$;~Jfqha@zDLaDc?4G~2@Yzb&{)HXN{v%7+ z5~CbFqja7{Xr1RUh3u%pX>p_sqRJr-1- z*0KZ3q+f5t9os);w;}Z{lU*-MyO+s*Rq2Mf499ag~h4^nr=_385Kz2_9|Jrbbg~vmA?k3)ay)5cZ*MgZwbf!(56x yE*wO!+80UGtWm8PwoU@f@f&dc>39!oEN3x5P&W%j-195p`YMbXMtFrDWcwdx_D^a6 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 74505aa..3ccb603 100644 --- a/main.py +++ b/main.py @@ -6,54 +6,62 @@ import subprocess # Environment Variables -CHART_NAME = os.getenv("PLUGIN_CHART_NAME") -CHART_VERSION = os.getenv("PLUGIN_CHART_VERSION", "1.0.0") -DOCKER_REGISTRY = os.getenv( - "PLUGIN_DOCKER_REGISTRY", 'registry.hub.docker.com') +def main_function(): -DOCKER_USERNAME = os.getenv( - "PLUGIN_DOCKER_USERNAME") -DOCKER_PASSWORD = os.getenv( - "PLUGIN_DOCKER_PASSWORD") + CHART_NAME = os.getenv("PLUGIN_CHART_NAME") + CHART_VERSION = os.getenv("PLUGIN_CHART_VERSION", "1.0.0") -CHART_PATH = os.getenv("PLUGIN_CHART_PATH") + DOCKER_REGISTRY = os.getenv( + "PLUGIN_DOCKER_REGISTRY", 'registry.hub.docker.com') -if (CHART_NAME is None): - print("Please provide a chart name") - exit(1) + DOCKER_USERNAME = os.getenv( + "PLUGIN_DOCKER_USERNAME") + DOCKER_PASSWORD = os.getenv( + "PLUGIN_DOCKER_PASSWORD") -if (DOCKER_USERNAME is None or DOCKER_PASSWORD is None): - print("Please provide a username and a password") - exit(1) + CHART_PATH = os.getenv("PLUGIN_CHART_PATH") + + if (CHART_NAME is None or CHART_NAME == ""): + print("Please provide a chart name") + exit(1) + + if (DOCKER_USERNAME is None or DOCKER_PASSWORD is None or DOCKER_USERNAME == "" or DOCKER_PASSWORD == ""): + print("Please provide a username and a password") + exit(1) + + if (CHART_PATH is not None): + os.chdir(CHART_PATH) + + try: + if (subprocess.run(["helm", "package", "--dependency-update", "."]).returncode != 0): + raise Exception("Failed to package chart!") + except: + print("Failed to package chart!") + exit(1) + + chart_filename = f"{CHART_NAME}-{CHART_VERSION}.tgz" + + try: + login_command = ['helm', 'registry', 'login', DOCKER_REGISTRY, + '-u', DOCKER_USERNAME, '-p', DOCKER_PASSWORD] + if (subprocess.run(login_command).returncode != 0): + raise Exception("Failed to login!") + except: + print("Failed to login!") + exit(1) + + try: + docker_push_command = ["helm", "push", chart_filename, + f"oci://{DOCKER_REGISTRY}/{DOCKER_USERNAME}"] + if (subprocess.run(docker_push_command).returncode != 0): + raise Exception("Failed to push chart!") + else: + print("Chart pushed successfully.") + except: + print("Failed to push chart!") + exit(1) -if (CHART_PATH is not None): - os.chdir(CHART_PATH) - -try: - if (subprocess.run(["helm", "package", "--dependency-update", "."]).returncode != 0): - raise Exception("Failed to package chart!") -except: - print("Failed to package chart!") - exit(1) - -chart_filename = f"{CHART_NAME}-{CHART_VERSION}.tgz" - -try: - login_command = ['helm', 'registry', 'login', DOCKER_REGISTRY, - '-u', DOCKER_USERNAME, '-p', DOCKER_PASSWORD] - if (subprocess.run(login_command).returncode != 0): - raise Exception("Failed to login!") -except: - print("Failed to login!") - exit(1) - -try: - docker_push_command = ["helm", "push", chart_filename, - f"oci://{DOCKER_REGISTRY}/{DOCKER_USERNAME}"] - if (subprocess.run(docker_push_command).returncode != 0): - raise Exception("Failed to push chart!") -except: - print("Failed to push chart!") - exit(1) \ No newline at end of file +if __name__ == "__main__": + main_function() diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..edf6939 --- /dev/null +++ b/tests.py @@ -0,0 +1,97 @@ +import unittest +from unittest.mock import patch +import os +from io import StringIO +from main import main_function + + +class TestPushOCIChartToRegistry(unittest.TestCase): + + def tearDown(self): + os.environ["PLUGIN_CHART_NAME"] = "" + os.environ["PLUGIN_CHART_VERSION"] = "" + os.environ["PLUGIN_DOCKER_REGISTRY"] = "" + os.environ["PLUGIN_DOCKER_USERNAME"] = "" + os.environ["PLUGIN_DOCKER_PASSWORD"] = "" + os.environ["PLUGIN_CHART_PATH"] = "" + + @patch("subprocess.run") + def test_successful_chart_push(self, mock_subprocess_run): + os.environ["PLUGIN_CHART_NAME"] = "mywebapp" + test_docker_username = os.environ["TEST_DOCKER_USERNAME"] + test_docker_password = os.environ["TEST_DOCKER_PASSWORD"] + os.environ["PLUGIN_DOCKER_USERNAME"] = test_docker_username + os.environ["PLUGIN_DOCKER_PASSWORD"] = test_docker_password + os.environ["PLUGIN_CHART_PATH"] = "chart" + os.environ["PLUGIN_CHART_VERSION"] = "5.0.0" + os.environ["PLUGIN_DOCKER_REGISTRY"] = "registry.hub.docker.com" + + mock_subprocess_run.return_value.returncode = 0 + + with patch("sys.stdout", new_callable=StringIO) as mock_stdout: + main_function() + + mock_subprocess_run.assert_called_with( + ["helm", "push", "mywebapp-5.0.0.tgz", f"oci://registry.hub.docker.com/{test_docker_username}"]) + + expected_output = 'Chart pushed successfully.' + self.assertEqual(mock_stdout.getvalue().strip(), expected_output) + + @patch("subprocess.run") + def test_failed_to_package_chart(self, mock_subprocess_run): + os.environ["PLUGIN_CHART_NAME"] = "mywebapp" + test_docker_username = os.environ["TEST_DOCKER_USERNAME"] + test_docker_password = os.environ["TEST_DOCKER_PASSWORD"] + os.environ["PLUGIN_DOCKER_USERNAME"] = test_docker_username + os.environ["PLUGIN_DOCKER_PASSWORD"] = test_docker_password + os.environ["PLUGIN_CHART_PATH"] = "chart" + + mock_subprocess_run.return_value.returncode = 1 + + with patch("sys.stdout", new_callable=StringIO) as mock_stdout: + with self.assertRaises(SystemExit) as context: + main_function() + + self.assertEqual(context.exception.code, 1) + + expected_output = 'Failed to package chart!' + self.assertEqual(mock_stdout.getvalue().strip(), expected_output) + + @patch("subprocess.run") + def test_chart_name_not_provided(self, mock_subprocess_run): + test_docker_username = os.environ["TEST_DOCKER_USERNAME"] + test_docker_password = os.environ["TEST_DOCKER_PASSWORD"] + os.environ["PLUGIN_DOCKER_USERNAME"] = test_docker_username + os.environ["PLUGIN_DOCKER_PASSWORD"] = test_docker_password + os.environ["PLUGIN_CHART_PATH"] = "chart" + + mock_subprocess_run.return_value.returncode = 0 + + with patch("sys.stdout", new_callable=StringIO) as mock_stdout: + with self.assertRaises(SystemExit) as context: + main_function() + + self.assertEqual(context.exception.code, 1) + + expected_output = 'Please provide a chart name' + self.assertEqual(mock_stdout.getvalue().strip(), expected_output) + + @patch("subprocess.run") + def test_username_and_password_not_provided(self, mock_subprocess_run): + os.environ["PLUGIN_CHART_NAME"] = "mywebapp" + os.environ["PLUGIN_CHART_PATH"] = "chart" + + mock_subprocess_run.return_value.returncode = 0 + + with patch("sys.stdout", new_callable=StringIO) as mock_stdout: + with self.assertRaises(SystemExit) as context: + main_function() + + self.assertEqual(context.exception.code, 1) + + expected_output = 'Please provide a username and a password' + self.assertEqual(mock_stdout.getvalue().strip(), expected_output) + + +if __name__ == '__main__': + unittest.main()