mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-04-19 23:41:18 +02:00
Refine AnyModel deserialization
This commit is contained in:
@@ -2409,30 +2409,29 @@ impl<'de> Deserialize<'de> for AnyModel {
|
||||
{
|
||||
let value = Value::deserialize(deserializer)?;
|
||||
let model = value.as_object().unwrap();
|
||||
use AnyModel::*;
|
||||
use serde_json::from_value as fv;
|
||||
|
||||
let model = match model.get("model") {
|
||||
Some(m) if m == "cookie_jar" => AnyModel::CookieJar(fv(value).unwrap()),
|
||||
Some(m) if m == "environment" => AnyModel::Environment(fv(value).unwrap()),
|
||||
Some(m) if m == "folder" => AnyModel::Folder(fv(value).unwrap()),
|
||||
Some(m) if m == "graphql_introspection" => {
|
||||
AnyModel::GraphQlIntrospection(fv(value).unwrap())
|
||||
}
|
||||
Some(m) if m == "grpc_connection" => AnyModel::GrpcConnection(fv(value).unwrap()),
|
||||
Some(m) if m == "grpc_event" => AnyModel::GrpcEvent(fv(value).unwrap()),
|
||||
Some(m) if m == "grpc_request" => AnyModel::GrpcRequest(fv(value).unwrap()),
|
||||
Some(m) if m == "http_request" => AnyModel::HttpRequest(fv(value).unwrap()),
|
||||
Some(m) if m == "http_response" => AnyModel::HttpResponse(fv(value).unwrap()),
|
||||
Some(m) if m == "key_value" => AnyModel::KeyValue(fv(value).unwrap()),
|
||||
Some(m) if m == "plugin" => AnyModel::Plugin(fv(value).unwrap()),
|
||||
Some(m) if m == "settings" => AnyModel::Settings(fv(value).unwrap()),
|
||||
Some(m) if m == "websocket_connection" => {
|
||||
AnyModel::WebsocketConnection(fv(value).unwrap())
|
||||
}
|
||||
Some(m) if m == "websocket_event" => AnyModel::WebsocketEvent(fv(value).unwrap()),
|
||||
Some(m) if m == "websocket_request" => AnyModel::WebsocketRequest(fv(value).unwrap()),
|
||||
Some(m) if m == "workspace" => AnyModel::Workspace(fv(value).unwrap()),
|
||||
Some(m) if m == "workspace_meta" => AnyModel::WorkspaceMeta(fv(value).unwrap()),
|
||||
Some(m) if m == "cookie_jar" => CookieJar(fv(value).unwrap()),
|
||||
Some(m) if m == "environment" => Environment(fv(value).unwrap()),
|
||||
Some(m) if m == "folder" => Folder(fv(value).unwrap()),
|
||||
Some(m) if m == "graphql_introspection" => GraphQlIntrospection(fv(value).unwrap()),
|
||||
Some(m) if m == "grpc_connection" => GrpcConnection(fv(value).unwrap()),
|
||||
Some(m) if m == "grpc_event" => GrpcEvent(fv(value).unwrap()),
|
||||
Some(m) if m == "grpc_request" => GrpcRequest(fv(value).unwrap()),
|
||||
Some(m) if m == "http_request" => HttpRequest(fv(value).unwrap()),
|
||||
Some(m) if m == "http_response" => HttpResponse(fv(value).unwrap()),
|
||||
Some(m) if m == "http_response_event" => HttpResponseEvent(fv(value).unwrap()),
|
||||
Some(m) if m == "key_value" => KeyValue(fv(value).unwrap()),
|
||||
Some(m) if m == "plugin" => Plugin(fv(value).unwrap()),
|
||||
Some(m) if m == "settings" => Settings(fv(value).unwrap()),
|
||||
Some(m) if m == "sync_state" => SyncState(fv(value).unwrap()),
|
||||
Some(m) if m == "websocket_connection" => WebsocketConnection(fv(value).unwrap()),
|
||||
Some(m) if m == "websocket_event" => WebsocketEvent(fv(value).unwrap()),
|
||||
Some(m) if m == "websocket_request" => WebsocketRequest(fv(value).unwrap()),
|
||||
Some(m) if m == "workspace" => Workspace(fv(value).unwrap()),
|
||||
Some(m) if m == "workspace_meta" => WorkspaceMeta(fv(value).unwrap()),
|
||||
Some(m) => {
|
||||
return Err(serde::de::Error::custom(format!(
|
||||
"Failed to deserialize AnyModel {}",
|
||||
|
||||
@@ -99,6 +99,7 @@ mod tests {
|
||||
use crate::init_in_memory;
|
||||
use crate::models::Workspace;
|
||||
use crate::util::{ModelChangeEvent, UpdateSource};
|
||||
use serde_json::json;
|
||||
|
||||
#[test]
|
||||
fn records_model_changes_for_upsert_and_delete() {
|
||||
@@ -240,4 +241,49 @@ mod tests {
|
||||
db.prune_model_changes_older_than_hours(1).expect("Failed to prune model changes");
|
||||
assert_eq!(pruned, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn list_model_changes_deserializes_http_response_event_payload() {
|
||||
let (query_manager, _blob_manager, _rx) = init_in_memory().expect("Failed to init DB");
|
||||
let db = query_manager.connect();
|
||||
|
||||
let payload = json!({
|
||||
"model": {
|
||||
"model": "http_response_event",
|
||||
"id": "re_test",
|
||||
"createdAt": "2026-02-16T21:01:34.809162",
|
||||
"updatedAt": "2026-02-16T21:01:34.809163",
|
||||
"workspaceId": "wk_test",
|
||||
"responseId": "rs_test",
|
||||
"event": {
|
||||
"type": "info",
|
||||
"message": "hello"
|
||||
}
|
||||
},
|
||||
"updateSource": { "type": "sync" },
|
||||
"change": { "type": "upsert", "created": false }
|
||||
});
|
||||
|
||||
db.conn
|
||||
.resolve()
|
||||
.execute(
|
||||
r#"
|
||||
INSERT INTO model_changes (model, model_id, change, update_source, payload)
|
||||
VALUES (?1, ?2, ?3, ?4, ?5)
|
||||
"#,
|
||||
params![
|
||||
"http_response_event",
|
||||
"re_test",
|
||||
r#"{"type":"upsert","created":false}"#,
|
||||
r#"{"type":"sync"}"#,
|
||||
payload.to_string(),
|
||||
],
|
||||
)
|
||||
.expect("Failed to insert model change row");
|
||||
|
||||
let changes = db.list_model_changes_after(0, 10).expect("Failed to list changes");
|
||||
assert_eq!(changes.len(), 1);
|
||||
assert_eq!(changes[0].payload.model.model(), "http_response_event");
|
||||
assert_eq!(changes[0].payload.model.id(), "re_test");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user