From 91a06d623c30099e74422859325a9ee0e147cec0 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Thu, 13 Oct 2022 16:31:09 +0530 Subject: [PATCH 1/4] Bumps version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ddad9bf..92a3c10 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ packages = [ [project] name = "argocd" -version = "0.2.1" +version = "0.3.0" authors = [ { name = "Mayank Pathak", email = "onlinejudge95@gmail.com"} ] From 4382fc8f0342d639be015c0f350ed52e33c4f563 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Thu, 13 Oct 2022 16:31:35 +0530 Subject: [PATCH 2/4] Ignores local directory while running CI --- .github/workflows/mr_ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/mr_ci.yml b/.github/workflows/mr_ci.yml index ea2352b..86ec8a7 100644 --- a/.github/workflows/mr_ci.yml +++ b/.github/workflows/mr_ci.yml @@ -25,8 +25,8 @@ jobs: - name: Lint Step run: | black --check --target-version py310 . - isort --check --profile black --skip env . - flake8 --count --show-source --statistics --exclude .git,env,__init__.py --max-line-length 88 . + isort --check --profile black --skip build_env --skip test_env . + flake8 --count --show-source --statistics --exclude .git,build_env,test_env,__init__.py --max-line-length 88 . - name: Coverage with pytest run: | pytest --no-cov-on-fail --cov argocd --cov-report html --cov-report term --cov-report xml tests From 0981e56a732e455f3aff78771028a9fc299bf6cc Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Thu, 13 Oct 2022 17:01:58 +0530 Subject: [PATCH 3/4] Adds API for session service --- argocd/services/session.py | 39 ++++++++++++++++ tests/services/mocks.py | 21 +++++++++ tests/services/test_session.py | 83 ++++++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+) create mode 100644 argocd/services/session.py create mode 100644 tests/services/test_session.py diff --git a/argocd/services/session.py b/argocd/services/session.py new file mode 100644 index 0000000..f52a60a --- /dev/null +++ b/argocd/services/session.py @@ -0,0 +1,39 @@ +from requests import sessions + +from argocd import config + + +class SessionService: + def __init__(self): + self.config = config.Config() + self.session = sessions.Session() + + def create_session(self, password, token, username): + """ + Create a new JWT for authentication and set a cookie if using HTTP. + """ + base_url = self.config.server_url + response = self.session.post( + f"{base_url}/api/v1/session", + json={"password": password, "token": token, "username": username}, + ) + + return response.json() + + def delete_session(self): + """ + Delete an existing JWT cookie if using HTTP + """ + base_url = self.config.server_url + response = self.session.delete(f"{base_url}/api/v1/session") + + return response.json() + + def me(self): + """ + Get the current user's info + """ + base_url = self.config.server_url + response = self.session.get(f"{base_url}/api/v1/session/userinfo") + + return response.json() diff --git a/tests/services/mocks.py b/tests/services/mocks.py index 2f3f0aa..b82f5b7 100644 --- a/tests/services/mocks.py +++ b/tests/services/mocks.py @@ -57,3 +57,24 @@ def json(self): } return DummyClass() + + +def mocked_success_session_me_response(*args, **kwargs): + class DummyClass: + def json(self): + return { + "loggedIn": True, + "username": "user@example.com", + "iss": "https://cd.apps.argoproj.io/api/dex", + "groups": ["groups@example.com"], + } + + return DummyClass() + + +def mocked_success_session_create_and_delete_session_response(*args, **kwargs): + class DummyClass: + def json(self): + return {"token": "secure_token"} + + return DummyClass() diff --git a/tests/services/test_session.py b/tests/services/test_session.py new file mode 100644 index 0000000..7487d52 --- /dev/null +++ b/tests/services/test_session.py @@ -0,0 +1,83 @@ +import os +import unittest.mock + +import pytest + +from argocd.services import session +from tests.services import mocks + + +@pytest.fixture +def session_service(): + os.environ["ARGOCD_API_BASE_URL"] = "http://demo.com" + return session.SessionService() + + +@unittest.mock.patch( + "argocd.services.session.sessions.Session.get", + mocks.mocked_success_session_me_response, +) +def test_session_api_me_returns_ok(session_service): + response = session_service.me() + + assert isinstance(response, dict) + assert "username" in response + assert "groups" in response + assert isinstance(response["groups"], list) + + +@unittest.mock.patch( + "argocd.services.session.sessions.Session.get", + mocks.mocked_failure_generic_response, +) +def test_session_api_me_returns_non_ok(session_service): + response = session_service.me() + + assert isinstance(response, dict) + assert "error" in response.keys() + + +@unittest.mock.patch( + "argocd.services.session.sessions.Session.post", + mocks.mocked_success_session_create_and_delete_session_response, +) +def test_session_api_create_session_returns_ok(session_service): + response = session_service.create_session("password", "token", "username") + + assert isinstance(response, dict) + assert "token" in response.keys() + assert isinstance(response["token"], str) + + +@unittest.mock.patch( + "argocd.services.session.sessions.Session.post", + mocks.mocked_failure_generic_response, +) +def test_session_api_create_session_returns_not_ok(session_service): + response = session_service.create_session("password", "token", "username") + + assert isinstance(response, dict) + assert "error" in response.keys() + + +@unittest.mock.patch( + "argocd.services.session.sessions.Session.delete", + mocks.mocked_success_session_create_and_delete_session_response, +) +def test_session_api_delete_session_returns_ok(session_service): + response = session_service.delete_session() + + assert isinstance(response, dict) + assert "token" in response.keys() + assert isinstance(response["token"], str) + + +@unittest.mock.patch( + "argocd.services.session.sessions.Session.delete", + mocks.mocked_failure_generic_response, +) +def test_session_api_delete_session_returns_not_ok(session_service): + response = session_service.delete_session() + + assert isinstance(response, dict) + assert "error" in response.keys() From 8155ed0cbcf567d748069ea31d4c19bfc3078945 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Thu, 13 Oct 2022 17:11:23 +0530 Subject: [PATCH 4/4] Refactors session service --- argocd/services/session.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/argocd/services/session.py b/argocd/services/session.py index f52a60a..8e40239 100644 --- a/argocd/services/session.py +++ b/argocd/services/session.py @@ -7,14 +7,14 @@ class SessionService: def __init__(self): self.config = config.Config() self.session = sessions.Session() + self.base_url = self.config.server_url def create_session(self, password, token, username): """ Create a new JWT for authentication and set a cookie if using HTTP. """ - base_url = self.config.server_url response = self.session.post( - f"{base_url}/api/v1/session", + f"{self.base_url}/api/v1/session", json={"password": password, "token": token, "username": username}, ) @@ -24,8 +24,7 @@ def delete_session(self): """ Delete an existing JWT cookie if using HTTP """ - base_url = self.config.server_url - response = self.session.delete(f"{base_url}/api/v1/session") + response = self.session.delete(f"{self.base_url}/api/v1/session") return response.json() @@ -33,7 +32,6 @@ def me(self): """ Get the current user's info """ - base_url = self.config.server_url - response = self.session.get(f"{base_url}/api/v1/session/userinfo") + response = self.session.get(f"{self.base_url}/api/v1/session/userinfo") return response.json()