Skip to content

Commit 6c7fdc8

Browse files
committed
tests/util/github: Implement stub data client via mockall
1 parent ce0fbb7 commit 6c7fdc8

File tree

2 files changed

+37
-43
lines changed

2 files changed

+37
-43
lines changed

src/tests/util/github.rs

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
use anyhow::anyhow;
2-
use async_trait::async_trait;
32
use crates_io_github::{
4-
GitHubClient, GitHubError, GitHubOrgMembership, GitHubOrganization, GitHubPublicKey,
5-
GitHubTeam, GitHubTeamMembership, GithubUser,
3+
GitHubError, GitHubOrgMembership, GitHubOrganization, GitHubPublicKey, GitHubTeam,
4+
GitHubTeamMembership, GithubUser, MockGitHubClient,
65
};
7-
use oauth2::AccessToken;
86
use std::sync::atomic::{AtomicUsize, Ordering};
97

108
static NEXT_GH_ID: AtomicUsize = AtomicUsize::new(0);
@@ -61,20 +59,35 @@ pub(crate) const MOCK_GITHUB_DATA: MockData = MockData {
6159
],
6260
};
6361

64-
pub(crate) struct MockGitHubClient {
65-
data: &'static MockData,
66-
}
62+
impl MockData {
63+
pub fn as_mock_client(&'static self) -> MockGitHubClient {
64+
let mut mock = MockGitHubClient::new();
65+
66+
mock.expect_current_user()
67+
.returning(|_auth| self.current_user());
68+
69+
mock.expect_org_by_name()
70+
.returning(|org_name, _auth| self.org_by_name(org_name));
71+
72+
mock.expect_team_by_name()
73+
.returning(|org_name, team_name, _auth| self.team_by_name(org_name, team_name));
74+
75+
mock.expect_team_membership()
76+
.returning(|org_id, team_id, username, _auth| {
77+
self.team_membership(org_id, team_id, username)
78+
});
79+
80+
mock.expect_org_membership()
81+
.returning(|org_id, username, _auth| self.org_membership(org_id, username));
6782

68-
impl MockGitHubClient {
69-
pub(crate) fn new(data: &'static MockData) -> Self {
70-
Self { data }
83+
mock.expect_public_keys()
84+
.returning(|_username, _password| self.public_keys());
85+
86+
mock
7187
}
72-
}
7388

74-
#[async_trait]
75-
impl GitHubClient for MockGitHubClient {
76-
async fn current_user(&self, _auth: &AccessToken) -> Result<GithubUser, GitHubError> {
77-
let user = &self.data.users[0];
89+
fn current_user(&self) -> Result<GithubUser, GitHubError> {
90+
let user = &self.users[0];
7891
Ok(GithubUser {
7992
id: user.id,
8093
login: user.login.into(),
@@ -84,13 +97,8 @@ impl GitHubClient for MockGitHubClient {
8497
})
8598
}
8699

87-
async fn org_by_name(
88-
&self,
89-
org_name: &str,
90-
_auth: &AccessToken,
91-
) -> Result<GitHubOrganization, GitHubError> {
100+
fn org_by_name(&self, org_name: &str) -> Result<GitHubOrganization, GitHubError> {
92101
let org = self
93-
.data
94102
.orgs
95103
.iter()
96104
.find(|org| org.name == org_name.to_lowercase())
@@ -101,14 +109,8 @@ impl GitHubClient for MockGitHubClient {
101109
})
102110
}
103111

104-
async fn team_by_name(
105-
&self,
106-
org_name: &str,
107-
team_name: &str,
108-
auth: &AccessToken,
109-
) -> Result<GitHubTeam, GitHubError> {
112+
fn team_by_name(&self, org_name: &str, team_name: &str) -> Result<GitHubTeam, GitHubError> {
110113
let team = self
111-
.data
112114
.orgs
113115
.iter()
114116
.find(|org| org.name == org_name.to_lowercase())
@@ -120,19 +122,17 @@ impl GitHubClient for MockGitHubClient {
120122
Ok(GitHubTeam {
121123
id: team.id,
122124
name: Some(team.name.into()),
123-
organization: self.org_by_name(org_name, auth).await?,
125+
organization: self.org_by_name(org_name)?,
124126
})
125127
}
126128

127-
async fn team_membership(
129+
fn team_membership(
128130
&self,
129131
org_id: i32,
130132
team_id: i32,
131133
username: &str,
132-
_auth: &AccessToken,
133134
) -> Result<GitHubTeamMembership, GitHubError> {
134135
let team = self
135-
.data
136136
.orgs
137137
.iter()
138138
.find(|org| org.id == org_id)
@@ -150,14 +150,12 @@ impl GitHubClient for MockGitHubClient {
150150
}
151151
}
152152

153-
async fn org_membership(
153+
fn org_membership(
154154
&self,
155155
org_id: i32,
156156
username: &str,
157-
_auth: &AccessToken,
158157
) -> Result<GitHubOrgMembership, GitHubError> {
159158
let org = self
160-
.data
161159
.orgs
162160
.iter()
163161
.find(|org| org.id == org_id)
@@ -181,12 +179,8 @@ impl GitHubClient for MockGitHubClient {
181179
}
182180
}
183181

184-
async fn public_keys(
185-
&self,
186-
_username: &str,
187-
_password: &str,
188-
) -> Result<Vec<GitHubPublicKey>, GitHubError> {
189-
Ok(self.data.public_keys.iter().map(Into::into).collect())
182+
fn public_keys(&self) -> Result<Vec<GitHubPublicKey>, GitHubError> {
183+
Ok(self.public_keys.iter().map(Into::into).collect())
190184
}
191185
}
192186

src/tests/util/test_app.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::rate_limiter::{LimitedAction, RateLimiterConfig};
99
use crate::schema::users;
1010
use crate::storage::StorageConfig;
1111
use crate::tests::util::chaosproxy::ChaosProxy;
12-
use crate::tests::util::github::{MockGitHubClient, MOCK_GITHUB_DATA};
12+
use crate::tests::util::github::MOCK_GITHUB_DATA;
1313
use crate::worker::{Environment, RunnerExt};
1414
use crate::{App, Emails, Env};
1515
use crates_io_index::testing::UpstreamIndex;
@@ -494,7 +494,7 @@ fn build_app(config: config::Server) -> (Arc<App>, axum::Router) {
494494

495495
// Use a custom mock for the GitHub client, allowing to define the GitHub users and
496496
// organizations without actually having to create GitHub accounts.
497-
let github = Box::new(MockGitHubClient::new(&MOCK_GITHUB_DATA));
497+
let github = Box::new(MOCK_GITHUB_DATA.as_mock_client());
498498

499499
let app = App::new(config, emails, github);
500500

0 commit comments

Comments
 (0)