Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 9 additions & 11 deletions src/typosquat/database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ impl From<crate::models::Owner> for Owner {

#[cfg(test)]
mod tests {
use crate::{test_util::test_db_connection, typosquat::test_util::Faker};
use crate::{test_util::test_db_connection, typosquat::test_util::faker};
use thiserror::Error;

use super::*;
Expand All @@ -172,21 +172,19 @@ mod tests {
fn top_crates() -> Result<(), Error> {
let (_test_db, mut conn) = test_db_connection();

let mut faker = Faker::new();

// Set up two users.
let user_a = faker.user(&mut conn, "a")?;
let user_b = faker.user(&mut conn, "b")?;
let user_a = faker::user(&mut conn, "a")?;
let user_b = faker::user(&mut conn, "b")?;

// Set up three crates with various ownership schemes.
let _top_a = faker.crate_and_version(&mut conn, "a", "Hello", &user_a, 2)?;
let top_b = faker.crate_and_version(&mut conn, "b", "Yes, this is dog", &user_b, 1)?;
let not_top_c = faker.crate_and_version(&mut conn, "c", "Unpopular", &user_a, 0)?;
let _top_a = faker::crate_and_version(&mut conn, "a", "Hello", &user_a, 2)?;
let top_b = faker::crate_and_version(&mut conn, "b", "Yes, this is dog", &user_b, 1)?;
let not_top_c = faker::crate_and_version(&mut conn, "c", "Unpopular", &user_a, 0)?;

// Let's set up a team that owns both b and c, but not a.
let not_the_a_team = faker.team(&mut conn, "org", "team")?;
faker.add_crate_to_team(&mut conn, &user_b, &top_b.0, &not_the_a_team)?;
faker.add_crate_to_team(&mut conn, &user_b, &not_top_c.0, &not_the_a_team)?;
let not_the_a_team = faker::team(&mut conn, "org", "team")?;
faker::add_crate_to_team(&mut conn, &user_b, &top_b.0, &not_the_a_team)?;
faker::add_crate_to_team(&mut conn, &user_b, &not_top_c.0, &not_the_a_team)?;

let top_crates = TopCrates::new(&mut conn, 2)?;

Expand Down
38 changes: 10 additions & 28 deletions src/typosquat/test_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,13 @@ use crate::{
models::{
Crate, CrateOwner, NewCrate, NewTeam, NewUser, NewVersion, Owner, OwnerKind, User, Version,
},
schema::{crate_downloads, crate_owners},
Emails,
schema::{crate_downloads, crate_owners, users},
};

pub struct Faker {
emails: Emails,
}

impl Faker {
pub fn new() -> Self {
Self {
emails: Emails::new_in_memory(),
}
}
pub mod faker {
use super::*;

pub fn add_crate_to_team(
&mut self,
conn: &mut PgConnection,
user: &User,
krate: &Crate,
Expand All @@ -43,7 +33,6 @@ impl Faker {
}

pub fn crate_and_version(
&mut self,
conn: &mut PgConnection,
name: &str,
description: &str,
Expand Down Expand Up @@ -73,12 +62,7 @@ impl Faker {
Ok((krate, version))
}

pub fn team(
&mut self,
conn: &mut PgConnection,
org: &str,
team: &str,
) -> anyhow::Result<Owner> {
pub fn team(conn: &mut PgConnection, org: &str, team: &str) -> anyhow::Result<Owner> {
Ok(Owner::Team(
NewTeam::new(
&format!("github:{org}:{team}"),
Expand All @@ -91,13 +75,11 @@ impl Faker {
))
}

pub fn user(&mut self, conn: &mut PgConnection, login: &str) -> anyhow::Result<User> {
Ok(
NewUser::new(next_gh_id(), login, None, None, "token").create_or_update(
None,
&self.emails,
conn,
)?,
)
pub fn user(conn: &mut PgConnection, login: &str) -> QueryResult<User> {
let user = NewUser::new(next_gh_id(), login, None, None, "token");

diesel::insert_into(users::table)
.values(user)
.get_result(conn)
}
}
13 changes: 6 additions & 7 deletions src/worker/jobs/typosquat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ Specific squat checks that triggered:

#[cfg(test)]
mod tests {
use crate::{test_util::test_db_connection, typosquat::test_util::Faker};
use crate::{test_util::test_db_connection, typosquat::test_util::faker};
use lettre::Address;

use super::*;
Expand All @@ -131,25 +131,24 @@ mod tests {
fn integration() -> anyhow::Result<()> {
let emails = Emails::new_in_memory();
let (_test_db, mut conn) = test_db_connection();
let mut faker = Faker::new();

// Set up a user and a popular crate to match against.
let user = faker.user(&mut conn, "a")?;
faker.crate_and_version(&mut conn, "my-crate", "It's awesome", &user, 100)?;
let user = faker::user(&mut conn, "a")?;
faker::crate_and_version(&mut conn, "my-crate", "It's awesome", &user, 100)?;

// Prime the cache so it only includes the crate we just created.
let cache = Cache::new(vec!["admin@example.com".to_string()], &mut conn)?;

// Now we'll create new crates: one problematic, one not so.
let other_user = faker.user(&mut conn, "b")?;
let (angel, _version) = faker.crate_and_version(
let other_user = faker::user(&mut conn, "b")?;
let (angel, _version) = faker::crate_and_version(
&mut conn,
"innocent-crate",
"I'm just a simple, innocent crate",
&other_user,
0,
)?;
let (demon, _version) = faker.crate_and_version(
let (demon, _version) = faker::crate_and_version(
&mut conn,
"mycrate",
"I'm even more innocent, obviously",
Expand Down