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):
