Clean up server.rs, add DB and Client aliases
This commit is contained in:
parent
7bb4cf4230
commit
f5fc83a471
5 changed files with 153 additions and 128 deletions
|
|
@ -1,6 +1,6 @@
|
|||
use sqlx::SqlitePool;
|
||||
use crate::{
|
||||
Result,
|
||||
AdapterPool,
|
||||
Feed,
|
||||
feed::UnparsedFeed,
|
||||
};
|
||||
|
|
@ -31,31 +31,31 @@ impl User {
|
|||
pub fn id(&self) -> UserId { self.id }
|
||||
pub fn name(&self) -> &str { &self.name }
|
||||
|
||||
pub async fn get(pool: &SqlitePool, id: UserId) -> Result<Self> {
|
||||
pub async fn get(pool: &AdapterPool, id: UserId) -> Result<Self> {
|
||||
let user = sqlx::query_as!(
|
||||
UnparsedUser,
|
||||
"SELECT id, name FROM users WHERE id = ?",
|
||||
id.0
|
||||
).fetch_one(pool).await?.parse();
|
||||
).fetch_one(&pool.0).await?.parse();
|
||||
|
||||
user
|
||||
}
|
||||
pub async fn get_all(pool: &SqlitePool) -> Result<Vec<Self>> {
|
||||
pub async fn get_all(pool: &AdapterPool) -> Result<Vec<Self>> {
|
||||
let users: Result<Vec<Self>> = sqlx::query_as!(
|
||||
UnparsedUser,
|
||||
"SELECT id, name FROM users"
|
||||
).fetch_all(pool).await?.into_iter().map(UnparsedUser::parse).collect();
|
||||
).fetch_all(&pool.0).await?.into_iter().map(UnparsedUser::parse).collect();
|
||||
|
||||
users
|
||||
}
|
||||
|
||||
pub async fn create(pool: &SqlitePool, name: &str) -> Result<Self> {
|
||||
pub async fn create(pool: &AdapterPool, name: &str) -> Result<Self> {
|
||||
let result = sqlx::query!(
|
||||
"INSERT INTO users (name)
|
||||
VALUES (?)
|
||||
RETURNING id, name",
|
||||
name
|
||||
).fetch_one(pool).await?;
|
||||
).fetch_one(&pool.0).await?;
|
||||
|
||||
Ok(Self {
|
||||
id: UserId(result.id),
|
||||
|
|
@ -64,22 +64,22 @@ impl User {
|
|||
}
|
||||
|
||||
pub async fn update_name(
|
||||
pool: &SqlitePool, id: UserId, new_name: &str
|
||||
pool: &AdapterPool, id: UserId, new_name: &str
|
||||
) -> Result<()> {
|
||||
sqlx::query!(
|
||||
"UPDATE users SET name = ? WHERE id = ?",
|
||||
new_name, id.0
|
||||
).execute(pool).await?;
|
||||
).execute(&pool.0).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn get_feeds(&self, pool: &SqlitePool) -> Result<Vec<Feed>> {
|
||||
pub async fn get_feeds(&self, pool: &AdapterPool) -> Result<Vec<Feed>> {
|
||||
let feeds: Result<Vec<Feed>> = sqlx::query_as!(
|
||||
UnparsedFeed,
|
||||
"SELECT id, title FROM feeds WHERE user_id = ?",
|
||||
self.id.0
|
||||
).fetch_all(pool).await?.into_iter()
|
||||
).fetch_all(&pool.0).await?.into_iter()
|
||||
.map(UnparsedFeed::parse).collect();
|
||||
|
||||
feeds
|
||||
|
|
@ -89,30 +89,32 @@ impl User {
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use sqlx::SqlitePool;
|
||||
use crate::{AdapterBuilder, Adapter};
|
||||
|
||||
async fn setup_test_db() -> SqlitePool {
|
||||
let pool = SqlitePool::connect("sqlite::memory:").await.unwrap();
|
||||
sqlx::migrate!().run(&pool).await.unwrap();
|
||||
pool
|
||||
async fn setup_adapter() -> Adapter {
|
||||
AdapterBuilder::new()
|
||||
.database_url("sqlite::memory:")
|
||||
.create().await.unwrap()
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_user() {
|
||||
let pool = setup_test_db().await;
|
||||
let adapter = setup_adapter().await;
|
||||
let pool = adapter.get_pool();
|
||||
|
||||
let new_user = User::create(&pool, "Alice").await.unwrap();
|
||||
let new_user = User::create(pool, "Alice").await.unwrap();
|
||||
|
||||
let fetched_user = User::get(&pool, new_user.id).await.unwrap();
|
||||
let fetched_user = User::get(pool, new_user.id).await.unwrap();
|
||||
assert_eq!(fetched_user.name, "Alice");
|
||||
assert!(fetched_user.id.0 > 0);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn create_user() {
|
||||
let pool = setup_test_db().await;
|
||||
let adapter = setup_adapter().await;
|
||||
let pool = adapter.get_pool();
|
||||
|
||||
let user = User::create(&pool, "Alice").await.unwrap();
|
||||
let user = User::create(pool, "Alice").await.unwrap();
|
||||
|
||||
assert_eq!(user.name, "Alice");
|
||||
assert!(user.id.0 > 0);
|
||||
|
|
@ -120,22 +122,24 @@ mod tests {
|
|||
|
||||
#[tokio::test]
|
||||
async fn create_duplicate_user() {
|
||||
let pool = setup_test_db().await;
|
||||
let adapter = setup_adapter().await;
|
||||
let pool = adapter.get_pool();
|
||||
|
||||
let _user = User::create(&pool, "Alice").await.unwrap();
|
||||
let duplicate_user = User::create(&pool, "Alice").await;
|
||||
let _user = User::create(pool, "Alice").await.unwrap();
|
||||
let duplicate_user = User::create(pool, "Alice").await;
|
||||
|
||||
assert!(duplicate_user.is_err());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_all_users() {
|
||||
let pool = setup_test_db().await;
|
||||
let adapter = setup_adapter().await;
|
||||
let pool = adapter.get_pool();
|
||||
|
||||
User::create(&pool, "Alice").await.unwrap();
|
||||
User::create(&pool, "Bob").await.unwrap();
|
||||
User::create(pool, "Alice").await.unwrap();
|
||||
User::create(pool, "Bob").await.unwrap();
|
||||
|
||||
let users = User::get_all(&pool).await.unwrap();
|
||||
let users = User::get_all(pool).await.unwrap();
|
||||
|
||||
assert_eq!(users.len(), 2);
|
||||
assert!(users.iter().any(|u| u.name == "Alice"));
|
||||
|
|
@ -144,32 +148,35 @@ mod tests {
|
|||
|
||||
#[tokio::test]
|
||||
async fn update_name() {
|
||||
let pool = setup_test_db().await;
|
||||
let adapter = setup_adapter().await;
|
||||
let pool = adapter.get_pool();
|
||||
|
||||
let user = User::create(&pool, "Alice").await.unwrap();
|
||||
User::update_name(&pool, user.id, "Alicia").await.unwrap();
|
||||
let user = User::create(pool, "Alice").await.unwrap();
|
||||
User::update_name(pool, user.id, "Alicia").await.unwrap();
|
||||
|
||||
let updated = User::get(&pool, user.id).await.unwrap();
|
||||
let updated = User::get(pool, user.id).await.unwrap();
|
||||
assert_eq!(updated.name, "Alicia");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn update_name_to_duplicate() {
|
||||
let pool = setup_test_db().await;
|
||||
let adapter = setup_adapter().await;
|
||||
let pool = adapter.get_pool();
|
||||
|
||||
let alice = User::create(&pool, "Alice").await.unwrap();
|
||||
let _sam = User::create(&pool, "Sam").await.unwrap();
|
||||
let status = User::update_name(&pool, alice.id, "Sam").await;
|
||||
let alice = User::create(pool, "Alice").await.unwrap();
|
||||
let _sam = User::create(pool, "Sam").await.unwrap();
|
||||
let status = User::update_name(pool, alice.id, "Sam").await;
|
||||
|
||||
assert!(status.is_err());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_feeds_empty() {
|
||||
let pool = setup_test_db().await;
|
||||
let adapter = setup_adapter().await;
|
||||
let pool = adapter.get_pool();
|
||||
|
||||
let user = User::create(&pool, "Alice").await.unwrap();
|
||||
let feeds = user.get_feeds(&pool).await.unwrap();
|
||||
let user = User::create(pool, "Alice").await.unwrap();
|
||||
let feeds = user.get_feeds(pool).await.unwrap();
|
||||
|
||||
assert_eq!(feeds.len(), 0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue