36:class TestClientJsonParsing: 37: def test_valid_installed(self): 44: def test_valid_web(self): 50: def test_invalid_json(self): 54: def test_missing_keys(self): 61:class TestStateAndAuthUrl: 62: def test_state_random_and_unique(self): 67: def test_authorization_url_contents(self): 77: def test_scope_includes_gmail_send_and_userinfo(self): 86:class TestResolveClientConfig: 87: def test_explicit_config_dict_wins(self): 92: def test_no_config_raises(self): 99: def test_env_file_path(self, tmp_path): 109: def test_bad_env_file(self, tmp_path): 128:class TestTokenExchange: 129: def test_success(self): 136: def test_http_failure_raises(self): 142: def test_missing_access_token(self): 149:class TestTokenRefresh: 150: def test_success(self): 156: def test_failure(self): 162:class TestRevoke: 163: def test_success(self): 167: def test_failure(self): 171: def test_empty_token(self): 174: def test_network_error_false(self): 179:class TestUserinfo: 180: def test_success(self): 185: def test_failure(self): 191:class TestGmailClientSendApi: 198: def test_send_mime_api_returns_provider_response(self): 217: def test_send_mime_smtp_xoauth2(self): 261: def test_send_mime_smtp_refused_recipient(self): 293: def test_verify_connection_ok(self): 303: def test_verify_connection_failure_reports_honestly(self): 312: def test_invalid_method_falls_back_to_api(self):