mrmime 0.0.2

Small, explicit MIME type registry with fast lookup by type or extension.
#![cfg(feature = "diesel")]

use diesel::{
    deserialize::QueryableByName, prelude::*, sql_query, sql_types::Text, SqliteConnection,
};
use mrmime::MimeType;

fn sqlite_conn() -> SqliteConnection {
    // In-memory SQLite DB
    SqliteConnection::establish(":memory:").expect("failed to create in-memory sqlite DB")
}

#[test]
fn diesel_bind_and_load_roundtrip() {
    let mut conn = sqlite_conn();

    let mt: MimeType = "application/json".parse().unwrap();

    #[derive(QueryableByName, Debug)]
    struct Row {
        #[diesel(sql_type = Text)]
        v: MimeType,
    }

    // Roundtrip via a raw SQL query binding a MimeType and loading it back
    let row: Row = sql_query("select ? as v")
        .bind::<Text, _>(mt)
        .get_result(&mut conn)
        .expect("diesel roundtrip failed");

    assert_eq!(row.v, mt);
}

#[test]
fn diesel_table_roundtrip() {
    let mut conn = sqlite_conn();
    sql_query("create table items (id integer primary key autoincrement, mt text not null)")
        .execute(&mut conn)
        .unwrap();

    let mt: MimeType = "image/png".parse().unwrap();

    // Insert via bind, read back as MimeType
    sql_query("insert into items (mt) values (?)")
        .bind::<Text, _>(mt)
        .execute(&mut conn)
        .unwrap();

    #[derive(QueryableByName, Debug)]
    struct ItemRow {
        #[diesel(sql_type = Text)]
        mt: MimeType,
    }

    let row: ItemRow = sql_query("select mt from items limit 1")
        .get_result(&mut conn)
        .unwrap();

    assert_eq!(row.mt, mt);
}

#[test]
fn diesel_deserialize_invalid_is_error() {
    let mut conn = sqlite_conn();
    // Attempt to deserialize an unknown MIME should error
    #[derive(QueryableByName, Debug)]
    struct Row {
        #[diesel(sql_type = Text)]
        #[allow(dead_code)]
        v: MimeType,
    }

    let err = sql_query("select 'application/not-registered' as v")
        .get_result::<Row>(&mut conn)
        .unwrap_err();

    let msg = err.to_string();
    // Should surface the original parse error message
    assert!(
        msg.to_lowercase().contains("not registered"),
        "unexpected error: {}",
        msg
    );
}