@@ -1201,5 +1201,166 @@ def pack_as_hash(package)
12011201 expect ( pack_as_hash ( all_packages . first ) ) . to eq pack_as_hash ( package )
12021202 end
12031203 end
1204+
1205+ describe 'preserve_key_order option' do
1206+ after do
1207+ ParsePackwerk . preserve_key_order = false
1208+ end
1209+
1210+ context 'when preserve_key_order is false (default)' do
1211+ before do
1212+ ParsePackwerk . preserve_key_order = false
1213+ write_file ( package_yml , <<~CONTENTS )
1214+ enforce_privacy: true
1215+ enforce_layers: true
1216+ layer: admin
1217+ enforce_dependencies: true
1218+ dependencies:
1219+ - packs/foo
1220+ CONTENTS
1221+ end
1222+
1223+ it 'reorders keys according to key_sort_order' do
1224+ package = ParsePackwerk ::Package . from ( package_yml )
1225+ ParsePackwerk . write_package_yml! ( package )
1226+
1227+ expect ( package_yml . read ) . to eq <<~PACKAGEYML
1228+ enforce_dependencies: true
1229+ enforce_privacy: true
1230+ enforce_layers: true
1231+ layer: admin
1232+ dependencies:
1233+ - packs/foo
1234+ PACKAGEYML
1235+ end
1236+ end
1237+
1238+ context 'when preserve_key_order is true' do
1239+ before do
1240+ ParsePackwerk . preserve_key_order = true
1241+ write_file ( package_yml , <<~CONTENTS )
1242+ enforce_privacy: true
1243+ enforce_layers: true
1244+ layer: admin
1245+ enforce_dependencies: true
1246+ dependencies:
1247+ - packs/foo
1248+ CONTENTS
1249+ end
1250+
1251+ it 'preserves the original key order from the file' do
1252+ package = ParsePackwerk ::Package . from ( package_yml )
1253+ ParsePackwerk . write_package_yml! ( package )
1254+
1255+ expect ( package_yml . read ) . to eq <<~PACKAGEYML
1256+ enforce_privacy: true
1257+ enforce_layers: true
1258+ layer: admin
1259+ enforce_dependencies: true
1260+ dependencies:
1261+ - packs/foo
1262+ PACKAGEYML
1263+ end
1264+
1265+ it 'appends new keys in canonical order at the end' do
1266+ package = ParsePackwerk ::Package . from ( package_yml )
1267+ # Add metadata which wasn't in the original file
1268+ new_package = package . with ( metadata : { 'owner' => 'Team A' } )
1269+ ParsePackwerk . write_package_yml! ( new_package )
1270+
1271+ expect ( package_yml . read ) . to eq <<~PACKAGEYML
1272+ enforce_privacy: true
1273+ enforce_layers: true
1274+ layer: admin
1275+ enforce_dependencies: true
1276+ dependencies:
1277+ - packs/foo
1278+ metadata:
1279+ owner: Team A
1280+ PACKAGEYML
1281+ end
1282+
1283+ it 'handles removed keys gracefully' do
1284+ package = ParsePackwerk ::Package . from ( package_yml )
1285+ # Remove dependencies
1286+ new_package = package . with ( dependencies : [ ] )
1287+ ParsePackwerk . write_package_yml! ( new_package )
1288+
1289+ expect ( package_yml . read ) . to eq <<~PACKAGEYML
1290+ enforce_privacy: true
1291+ enforce_layers: true
1292+ layer: admin
1293+ enforce_dependencies: true
1294+ PACKAGEYML
1295+ end
1296+ end
1297+
1298+ context 'when preserve_key_order is true but package has no original_key_order' do
1299+ before do
1300+ ParsePackwerk . preserve_key_order = true
1301+ end
1302+
1303+ it 'falls back to canonical key order for new packages' do
1304+ package = build_pack ( dependencies : [ 'packs/foo' ] )
1305+ ParsePackwerk . write_package_yml! ( package )
1306+
1307+ expect ( package_yml . read ) . to eq <<~PACKAGEYML
1308+ enforce_dependencies: true
1309+ enforce_privacy: true
1310+ enforce_layers: true
1311+ dependencies:
1312+ - packs/foo
1313+ PACKAGEYML
1314+ end
1315+ end
1316+
1317+ context 'when package is modified after reading' do
1318+ before do
1319+ ParsePackwerk . preserve_key_order = true
1320+ write_file ( package_yml , <<~CONTENTS )
1321+ enforce_privacy: true
1322+ enforce_layers: true
1323+ layer: admin
1324+ enforce_dependencies: true
1325+ dependencies:
1326+ - packs/foo
1327+ CONTENTS
1328+ end
1329+
1330+ it 'preserves key order even when dependencies change' do
1331+ package = ParsePackwerk ::Package . from ( package_yml )
1332+ # Change dependencies value but keep the key
1333+ new_package = package . with ( dependencies : [ 'packs/bar' , 'packs/baz' ] )
1334+ ParsePackwerk . write_package_yml! ( new_package )
1335+
1336+ expect ( package_yml . read ) . to eq <<~PACKAGEYML
1337+ enforce_privacy: true
1338+ enforce_layers: true
1339+ layer: admin
1340+ enforce_dependencies: true
1341+ dependencies:
1342+ - packs/bar
1343+ - packs/baz
1344+ PACKAGEYML
1345+ end
1346+ end
1347+
1348+ context 'preserves original key order when reading and writing package' do
1349+ before do
1350+ ParsePackwerk . preserve_key_order = true
1351+ end
1352+
1353+ it 'stores original_key_order when reading package' do
1354+ write_file ( package_yml , <<~CONTENTS )
1355+ enforce_privacy: true
1356+ layer: admin
1357+ enforce_dependencies: true
1358+ CONTENTS
1359+
1360+ package = ParsePackwerk ::Package . from ( package_yml )
1361+ expect ( package . original_key_order ) . to eq %w[ enforce_privacy layer enforce_dependencies ]
1362+ end
1363+ end
1364+ end
12041365 end
12051366end
0 commit comments