@@ -1082,3 +1082,156 @@ async fn test_get_empty_lines_preserved() {
10821082 println ! ( "✅ Line format verified" ) ;
10831083 println ! ( "\n ✅ Test passed: Empty lines and structure preserved in list" ) ;
10841084}
1085+
1086+ #[ tokio:: test]
1087+ async fn test_get_object_from_compiled_state_at_change ( ) {
1088+ let server = TestServer :: start ( )
1089+ . await
1090+ . expect ( "Failed to start test server" ) ;
1091+ let client = server. client ( ) ;
1092+ let db = server. db_assertions ( ) ;
1093+
1094+ println ! ( "Test: Getting an object at a change should work even if not modified in that change (compiled state)" ) ;
1095+
1096+ // Step 1: Create and approve object_a in change1
1097+ println ! ( "\n Step 1: Creating change 1 with object_a..." ) ;
1098+ client
1099+ . change_create ( "change1" , "test_author" , None )
1100+ . await
1101+ . expect ( "Failed to create change" ) ;
1102+
1103+ client
1104+ . object_update_from_file ( "object_a" , "test_object.moo" )
1105+ . await
1106+ . expect ( "Failed to create object" ) ;
1107+
1108+ let ( change_id1, _) = db. require_top_change ( ) ;
1109+ client
1110+ . change_approve ( & change_id1)
1111+ . await
1112+ . expect ( "Failed to approve" )
1113+ . assert_success ( "Approve" ) ;
1114+
1115+ println ! ( "✅ Change 1 approved with object_a, change ID: {}" , change_id1) ;
1116+
1117+ // Step 2: Create and approve object_b in change2 (object_a still exists but not modified)
1118+ println ! ( "\n Step 2: Creating change 2 with object_b..." ) ;
1119+ client
1120+ . change_create ( "change2" , "test_author" , None )
1121+ . await
1122+ . expect ( "Failed to create change" ) ;
1123+
1124+ client
1125+ . object_update_from_file ( "object_b" , "detailed_test_object.moo" )
1126+ . await
1127+ . expect ( "Failed to create object" ) ;
1128+
1129+ let ( change_id2, _) = db. require_top_change ( ) ;
1130+ client
1131+ . change_approve ( & change_id2)
1132+ . await
1133+ . expect ( "Failed to approve" )
1134+ . assert_success ( "Approve" ) ;
1135+
1136+ println ! ( "✅ Change 2 approved with object_b, change ID: {}" , change_id2) ;
1137+
1138+ // Step 3: Create and approve object_c in change3 (object_a and object_b still exist)
1139+ println ! ( "\n Step 3: Creating change 3 with object_c..." ) ;
1140+ client
1141+ . change_create ( "change3" , "test_author" , None )
1142+ . await
1143+ . expect ( "Failed to create change" ) ;
1144+
1145+ client
1146+ . object_update_from_file ( "object_c" , "test_object.moo" )
1147+ . await
1148+ . expect ( "Failed to create object" ) ;
1149+
1150+ let ( change_id3, _) = db. require_top_change ( ) ;
1151+ client
1152+ . change_approve ( & change_id3)
1153+ . await
1154+ . expect ( "Failed to approve" )
1155+ . assert_success ( "Approve" ) ;
1156+
1157+ println ! ( "✅ Change 3 approved with object_c, change ID: {}" , change_id3) ;
1158+
1159+ // Step 4: Get object_a at change2 (should work - it exists in compiled state)
1160+ println ! ( "\n Step 4: Getting object_a at change 2 (not modified in that change)..." ) ;
1161+ let response = client
1162+ . object_get_at_change ( "object_a" , & change_id2)
1163+ . await
1164+ . expect ( "Failed to get object_a at change2" ) ;
1165+
1166+ response. assert_success ( "Get object_a at change2" ) ;
1167+ let content = list_to_string ( & response) ;
1168+ assert ! (
1169+ content. contains( "Test Object" ) ,
1170+ "Should retrieve object_a from compiled state at change2"
1171+ ) ;
1172+ println ! ( "✅ object_a retrieved at change 2 (compiled state)" ) ;
1173+
1174+ // Step 5: Get object_a at change3 (should work - it exists in compiled state)
1175+ println ! ( "\n Step 5: Getting object_a at change 3 (not modified in that change)..." ) ;
1176+ let response = client
1177+ . object_get_at_change ( "object_a" , & change_id3)
1178+ . await
1179+ . expect ( "Failed to get object_a at change3" ) ;
1180+
1181+ response. assert_success ( "Get object_a at change3" ) ;
1182+ let content = list_to_string ( & response) ;
1183+ assert ! (
1184+ content. contains( "Test Object" ) ,
1185+ "Should retrieve object_a from compiled state at change3"
1186+ ) ;
1187+ println ! ( "✅ object_a retrieved at change 3 (compiled state)" ) ;
1188+
1189+ // Step 6: Get object_b at change3 (should work - it exists in compiled state)
1190+ println ! ( "\n Step 6: Getting object_b at change 3 (not modified in that change)..." ) ;
1191+ let response = client
1192+ . object_get_at_change ( "object_b" , & change_id3)
1193+ . await
1194+ . expect ( "Failed to get object_b at change3" ) ;
1195+
1196+ response. assert_success ( "Get object_b at change3" ) ;
1197+ let content = list_to_string ( & response) ;
1198+ assert ! (
1199+ content. contains( "Detailed Test Object" ) ,
1200+ "Should retrieve object_b from compiled state at change3"
1201+ ) ;
1202+ println ! ( "✅ object_b retrieved at change 3 (compiled state)" ) ;
1203+
1204+ // Step 7: Try to get object_b at change1 (should fail - doesn't exist yet)
1205+ println ! ( "\n Step 7: Attempting to get object_b at change 1 (before it existed)..." ) ;
1206+ let response = client
1207+ . object_get_at_change ( "object_b" , & change_id1)
1208+ . await
1209+ . expect ( "Request should complete" ) ;
1210+
1211+ // Should fail because object_b didn't exist yet at change1
1212+ let result_str = response. get_result_str ( ) . unwrap_or ( "" ) ;
1213+ assert ! (
1214+ result_str. contains( "Error" ) || result_str. contains( "not found" ) ,
1215+ "Should indicate object not found in compiled state at change1, got: {}" ,
1216+ result_str
1217+ ) ;
1218+ println ! ( "✅ Get failed appropriately (object didn't exist yet)" ) ;
1219+
1220+ // Step 8: Try to get object_c at change2 (should fail - doesn't exist yet)
1221+ println ! ( "\n Step 8: Attempting to get object_c at change 2 (before it existed)..." ) ;
1222+ let response = client
1223+ . object_get_at_change ( "object_c" , & change_id2)
1224+ . await
1225+ . expect ( "Request should complete" ) ;
1226+
1227+ // Should fail because object_c didn't exist yet at change2
1228+ let result_str = response. get_result_str ( ) . unwrap_or ( "" ) ;
1229+ assert ! (
1230+ result_str. contains( "Error" ) || result_str. contains( "not found" ) ,
1231+ "Should indicate object not found in compiled state at change2, got: {}" ,
1232+ result_str
1233+ ) ;
1234+ println ! ( "✅ Get failed appropriately (object didn't exist yet)" ) ;
1235+
1236+ println ! ( "\n ✅ Test passed: Objects can be retrieved from compiled state at any change where they existed" ) ;
1237+ }
0 commit comments