use uuid::Uuid; use crate::common::{ env::{create_env, TestEnv}, http::client::TestClient, assertions::response::assert_api_ok, }; use chrono::Utc; use database::enums::{AssetPermissionRole, AssetTypeEnum, IdentityTypeEnum}; use diesel::{ExpressionMethods, QueryDsl}; use diesel_async::RunQueryDsl; #[tokio::test] async fn test_get_metric_with_sharing_info() { // Setup test environment let env = create_env().await; let client = TestClient::new(&env); // Create test user and metric let user_id = Uuid::parse_str("00000000-0000-0000-0000-000000000001").unwrap(); let metric_id = create_test_metric(&env, user_id).await; // Add sharing permissions add_test_permissions(&env, metric_id, user_id).await; // Add public sharing enable_public_sharing(&env, metric_id, user_id).await; // Test GET request let response = client .get(&format!("/api/v1/metrics/{}", metric_id)) .header("X-User-Id", user_id.to_string()) .send() .await; // Assert success and verify response let data = assert_api_ok(response).await; // Check fields assert_eq!(data["id"], metric_id.to_string()); assert_eq!(data["type"], "metric"); // Check sharing fields assert_eq!(data["publicly_accessible"], true); assert!(data["public_expiry_date"].is_string()); assert_eq!(data["public_enabled_by"], "test@example.com"); assert_eq!(data["individual_permissions"].as_array().unwrap().len(), 1); let permission = &data["individual_permissions"][0]; assert_eq!(permission["email"], "test2@example.com"); assert_eq!(permission["role"], "viewer"); assert_eq!(permission["name"], "Test User 2"); } // Helper functions to set up the test data async fn create_test_metric(env: &TestEnv, user_id: Uuid) -> Uuid { let mut conn = env.db_pool.get().await.unwrap(); // Insert test user diesel::sql_query("INSERT INTO users (id, email, name) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING") .bind::(user_id) .bind::("test@example.com") .bind::("Test User") .execute(&mut conn) .await .unwrap(); // Insert another test user let user2_id = Uuid::parse_str("00000000-0000-0000-0000-000000000002").unwrap(); diesel::sql_query("INSERT INTO users (id, email, name) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING") .bind::(user2_id) .bind::("test2@example.com") .bind::("Test User 2") .execute(&mut conn) .await .unwrap(); // Insert test metric let metric_id = Uuid::parse_str("00000000-0000-0000-0000-000000000010").unwrap(); let org_id = Uuid::parse_str("00000000-0000-0000-0000-000000000100").unwrap(); // Insert test organization if needed diesel::sql_query("INSERT INTO organizations (id, name) VALUES ($1, $2) ON CONFLICT DO NOTHING") .bind::(org_id) .bind::("Test Organization") .execute(&mut conn) .await .unwrap(); // Insert metric diesel::sql_query(r#" INSERT INTO metric_files (id, name, file_name, content, verification, organization_id, created_by, version_history) VALUES ($1, 'Test Metric', 'test.yml', '{"description": "Test description", "time_frame": "daily", "dataset_ids": [], "chart_config": {}, "sql": "SELECT 1;"}', 'notRequested', $2, $3, '{}'::jsonb) ON CONFLICT DO NOTHING "#) .bind::(metric_id) .bind::(org_id) .bind::(user_id) .execute(&mut conn) .await .unwrap(); metric_id } async fn add_test_permissions(env: &TestEnv, metric_id: Uuid, user_id: Uuid) { let mut conn = env.db_pool.get().await.unwrap(); // Get the second user let user2_id = Uuid::parse_str("00000000-0000-0000-0000-000000000002").unwrap(); // Add permission for user2 as viewer diesel::sql_query(r#" INSERT INTO asset_permissions (identity_id, identity_type, asset_id, asset_type, role, created_by, updated_by) VALUES ($1, $2, $3, $4, $5, $6, $6) ON CONFLICT DO NOTHING "#) .bind::(user2_id) .bind::(IdentityTypeEnum::User.to_string()) .bind::(metric_id) .bind::(AssetTypeEnum::MetricFile.to_string()) .bind::(AssetPermissionRole::CanView.to_string()) .bind::(user_id) .execute(&mut conn) .await .unwrap(); } async fn enable_public_sharing(env: &TestEnv, metric_id: Uuid, user_id: Uuid) { let mut conn = env.db_pool.get().await.unwrap(); // Set public access let expiry_date = Utc::now() + chrono::Duration::days(7); diesel::sql_query(r#" UPDATE metric_files SET publicly_accessible = true, publicly_enabled_by = $1, public_expiry_date = $2 WHERE id = $3 "#) .bind::(user_id) .bind::(expiry_date) .bind::(metric_id) .execute(&mut conn) .await .unwrap(); }