From b8aacc7a671b2c8aecd229dcf1e83915d9fdb278 Mon Sep 17 00:00:00 2001 From: Neal Richardson Date: Fri, 23 Feb 2024 12:29:47 -0500 Subject: [PATCH] test: Add tests for Users with mock responses (#46) * Add a test with responses for users.find * Add TODOs * Add tests for to_pandas and find_one * Fix CI * test get user by id * Remove unused import --- requirements-dev.txt | 1 + src/posit/connect/users_test.py | 129 ++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) diff --git a/requirements-dev.txt b/requirements-dev.txt index d75abeb9..394c4955 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,3 +6,4 @@ responses>=0.25 ruff==0.1.14 setuptools==69.0.3 setuptools-scm==8.0.4 +pandas \ No newline at end of file diff --git a/src/posit/connect/users_test.py b/src/posit/connect/users_test.py index e2304214..08745053 100644 --- a/src/posit/connect/users_test.py +++ b/src/posit/connect/users_test.py @@ -1,7 +1,10 @@ import pytest +import responses +from pandas import DataFrame from unittest.mock import patch +from .client import Client from .users import Users @@ -21,3 +24,129 @@ class TestUsers: def test_init(self, mock_config, mock_session): with pytest.raises(ValueError): Users(mock_config, mock_session, page_size=9999) + + @responses.activate + def test_get_users(self): + responses.get( + "https://connect.example/__api__/v1/users", + match=[ + responses.matchers.query_param_matcher( + {"page_size": 2, "page_number": 1} + ) + ], + json={ + "results": [ + { + "email": "alice@connect.example", + "username": "al", + "first_name": "Alice", + "last_name": "User", + "user_role": "publisher", + "created_time": "2017-08-08T15:24:32Z", + "updated_time": "2023-03-02T20:25:06Z", + "active_time": "2018-05-09T16:58:45Z", + "confirmed": True, + "locked": False, + "guid": "a01792e3-2e67-402e-99af-be04a48da074", + }, + { + "email": "bob@connect.example", + "username": "robert", + "first_name": "Bob", + "last_name": "Loblaw", + "user_role": "publisher", + "created_time": "2023-01-06T19:47:29Z", + "updated_time": "2023-05-05T19:08:45Z", + "active_time": "2023-05-05T20:29:11Z", + "confirmed": True, + "locked": False, + "guid": "87c12c08-11cd-4de1-8da3-12a7579c4998", + }, + ], + "current_page": 1, + "total": 3, + }, + ) + responses.get( + "https://connect.example/__api__/v1/users", + match=[ + responses.matchers.query_param_matcher( + {"page_size": 2, "page_number": 2} + ) + ], + json={ + "results": [ + { + "email": "carlos@connect.example", + "username": "carlos12", + "first_name": "Carlos", + "last_name": "User", + "user_role": "publisher", + "created_time": "2019-09-09T15:24:32Z", + "updated_time": "2022-03-02T20:25:06Z", + "active_time": "2020-05-11T16:58:45Z", + "confirmed": True, + "locked": False, + "guid": "20a79ce3-6e87-4522-9faf-be24228800a4", + }, + ], + "current_page": 2, + "total": 3, + }, + ) + + con = Client(api_key="12345", url="https://connect.example/") + # TODO(#48): page_size should go with find(), can't pass it to client.users + u = con.users + u.page_size = 2 + # TODO(#47): Add __len__ method to Users + assert len(u.find().data) == 3 + + # Test to_pandas() + df = u.to_pandas() + assert isinstance(df, DataFrame) + assert df.shape == (3, 11) + assert df.columns.to_list() == [ + "email", + "username", + "first_name", + "last_name", + "user_role", + "created_time", + "updated_time", + "active_time", + "confirmed", + "locked", + "guid", + ] + assert df["username"].to_list() == ["al", "robert", "carlos12"] + + # Test find_one() + bob = u.find_one(lambda u: u["first_name"] == "Bob") + # Can't isinstance(bob, User) bc inherits TypedDict (cf. #23) + assert bob["username"] == "robert" + + @responses.activate + def test_users_get(self): + responses.get( + "https://connect.example/__api__/v1/users/20a79ce3-6e87-4522-9faf-be24228800a4", + json={ + "email": "carlos@connect.example", + "username": "carlos12", + "first_name": "Carlos", + "last_name": "User", + "user_role": "publisher", + "created_time": "2019-09-09T15:24:32Z", + "updated_time": "2022-03-02T20:25:06Z", + "active_time": "2020-05-11T16:58:45Z", + "confirmed": True, + "locked": False, + "guid": "20a79ce3-6e87-4522-9faf-be24228800a4", + }, + ) + + con = Client(api_key="12345", url="https://connect.example/") + assert ( + con.users.get("20a79ce3-6e87-4522-9faf-be24228800a4")["username"] + == "carlos12" + )