dce-session 1.0.0

A session lib with user binding and renewable.
Documentation
use std::collections::HashMap;
use redis::{cmd, Value};
use redis_test::{MockCmd, MockRedisConnection};
use serde::{Deserialize, Serialize};
use tokio::test;
use dce_session::redis::RedisBasic;
use dce_session::session::{Meta, Session};
use crate::common::redis;

mod common;

#[test]
async fn basic() {
    let sid_pool = (0..1).map(|_| Meta::gen_id(60).unwrap().0).collect::<Vec<_>>();
    let skey = RedisBasic::<MockRedisConnection>::gen_key("dcesid", &sid_pool[0]);
    let redis = redis(vec![
        MockCmd::new(cmd("HSET").arg(skey.as_str()).arg("uid").arg("10000"), Ok("1")),
        MockCmd::new(cmd("EXPIRE").arg(skey.as_str()).arg("3600"), Ok("1")),
        MockCmd::new(cmd("HGET").arg(skey.as_str()).arg("uid"), Ok("10000")),
        MockCmd::new(cmd("EXPIRE").arg(skey.as_str()).arg("3600"), Ok("true")),
        MockCmd::new(cmd("DEL").arg(skey.as_str()), Ok("1")),
        MockCmd::new(cmd("DEL").arg(skey.as_str()), Ok("0")),
    ]);

    let mut session = RedisBasic::new_with_id(sid_pool.clone()).unwrap().with(redis);
    session.set("uid", &10000).await.unwrap();
    let id = session.id().to_string();
    let uid: u64 = session.get("uid").await.unwrap();
    let result = session.destroy().await.unwrap();
    let result2 = session.destroy().await.unwrap();

    assert_eq!(id, sid_pool[0]);
    assert_eq!(uid, 10000);
    assert_eq!(result, true);
    assert_eq!(result2, false);
}

#[test]
async fn struct_store() {
    let sid_pool = (0..1).map(|_| Meta::gen_id(60).unwrap().0).collect::<Vec<_>>();
    let skey = RedisBasic::<MockRedisConnection>::gen_key("dcesid", &sid_pool[0]);
    let user = User {
        id: 10000,
        nick: "Dce".to_string(),
        gender: Gender::Male,
    };
    let user_string = serde_json::to_string::<User>(&user).unwrap();
    let items = vec!["user", &user_string];
    let items_value = Value::Bulk(items.iter().map(|e| Value::Data(e.as_bytes().into())).collect());
    let map = items.chunks(2).map(|cks| (cks[0].to_string(), cks[1].to_string())).collect::<HashMap<_, _>>();
    let redis = redis(vec![
        MockCmd::new(cmd("HSET").arg(skey.as_str()).arg("user").arg(user_string.as_str()), Ok("1")),
        MockCmd::new(cmd("EXPIRE").arg(skey.as_str()).arg("3600"), Ok("1")),
        MockCmd::new(cmd("HGET").arg(skey.as_str()).arg("user"), Ok(user_string)),
        MockCmd::new(cmd("HGETALL").arg(skey.as_str()), Ok(items_value)),
    ]);

    let mut session = RedisBasic::new_with_id(sid_pool).unwrap().with(redis);
    session.set("user", &user).await.unwrap();
    let u: User = session.get("user").await.unwrap();
    let data = session.raw().await.unwrap();

    assert_eq!(u, user);
    assert_eq!(data, map);
}

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct User {
    id: u64,
    nick: String,
    gender: Gender,
}

#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum Gender {
    Male,
    Female,
}