Skip to content

Commit bf855c8

Browse files
committed
LDEV-5699 add test for extension ordering
1 parent ea63de0 commit bf855c8

File tree

2 files changed

+261
-0
lines changed

2 files changed

+261
-0
lines changed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
{
2+
"COLUMNS": [
3+
"id",
4+
"version",
5+
"versionSortable",
6+
"name",
7+
"description",
8+
"filename",
9+
"image",
10+
"category",
11+
"author",
12+
"created",
13+
"releaseType",
14+
"minLoaderVersion",
15+
"minCoreVersion",
16+
"price",
17+
"currency",
18+
"disableFull",
19+
"trial",
20+
"older",
21+
"olderName",
22+
"olderDate",
23+
"promotionLevel",
24+
"promotionText",
25+
"projectUrl",
26+
"sourceUrl",
27+
"documentionUrl"
28+
],
29+
"DATA": [
30+
[
31+
"058215B3-5544-4392-A187A1649EB5CA90",
32+
"2.3.0.7-BETA",
33+
"02.003.000.0007.050",
34+
"WebSockets Client Extension",
35+
"Simple client for Websocket interaction for testing.",
36+
"websocket-client-extension-2.3.0.7-BETA.lex",
37+
"",
38+
"web",
39+
"",
40+
"2025-03-10 17:19:30",
41+
"server",
42+
"5.3.0.20",
43+
"",
44+
"",
45+
"",
46+
false,
47+
"",
48+
"",
49+
"",
50+
"",
51+
"",
52+
"",
53+
"",
54+
"",
55+
""
56+
],
57+
[
58+
"07082C66-510A-4F0B-B5E63814E2FDF7BE",
59+
"1.0.0.4-BETA",
60+
"01.000.000.0004.050",
61+
"WebSockets Extension",
62+
"WebSockets server extension.",
63+
"websockets-extension-1.0.0.4-BETA.lex",
64+
"",
65+
"web",
66+
"",
67+
"2024-12-01 10:00:00",
68+
"server",
69+
"5.3.0.20",
70+
"",
71+
"",
72+
"",
73+
"",
74+
false,
75+
"",
76+
"",
77+
"",
78+
"",
79+
"",
80+
"",
81+
"",
82+
""
83+
],
84+
[
85+
"16FF9B13-C595-4FA7-B87DED467B7E61A0",
86+
"4.0.0.5-SNAPSHOT",
87+
"04.000.000.0005.000",
88+
"Memcached Driver",
89+
"Free and open source, high-performance, distributed memory object caching system.",
90+
"memcached-extension-4.0.0.5-SNAPSHOT.lex",
91+
"",
92+
"cache",
93+
"",
94+
"2023-10-10 13:58:00",
95+
"server",
96+
"5.0.0.230",
97+
"",
98+
"",
99+
"",
100+
"",
101+
false,
102+
"",
103+
"",
104+
"",
105+
"",
106+
"",
107+
"",
108+
"",
109+
""
110+
],
111+
[
112+
"17AB52DE-B300-A94B-E058BD978511E39E",
113+
"2.0.2.16-SNAPSHOT",
114+
"02.000.002.0016.000",
115+
"S3 Resource Extension",
116+
"Core Extension to integrate Amazon Simple Storage Service (S3) Resource into Lucee.",
117+
"s3-extension-2.0.2.16-SNAPSHOT.lex",
118+
"",
119+
"resource",
120+
"",
121+
"2023-08-15 18:24:06",
122+
"server",
123+
"5.0.0.157",
124+
"",
125+
"",
126+
"",
127+
"",
128+
false,
129+
"",
130+
"",
131+
"",
132+
"",
133+
"",
134+
"",
135+
"",
136+
""
137+
]
138+
]
139+
}

tests/testExtensionNameOrder.cfc

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
component extends="org.lucee.cfml.test.LuceeTestCase" labels="data-provider-integration" {
2+
3+
function beforeAll(){
4+
variables.dir = getDirectoryFromPath(getCurrentTemplatePath());
5+
variables.testVersions = deserializeJson(FileRead("staticArtifacts/testExtensionCoreVersions.json"), false);
6+
7+
application action="update" mappings={
8+
"/services" : expandPath( dir & "../apps/updateserver/services" )
9+
};
10+
variables.extMetaReader = new services.ExtensionMetadataReader();
11+
variables.extMetaReader.loadMeta( variables.testVersions );
12+
13+
variables.compressExt = "8D7FB0DF-08BB-1589-FE3975678F07DB17";
14+
variables.imageExt = "B737ABC4-D43F-4D91-8E8E973E37C40D1B";
15+
}
16+
17+
function run( testResults , testBox ) {
18+
describe( "LDEV-5699 test extension listing by name", function() {
19+
20+
it (title="test extension list is sorted by name (production data)", body=function(){
21+
// Load production-like data from static artifact
22+
var dir = getDirectoryFromPath(getCurrentTemplatePath());
23+
// Lucee will convert {COLUMNS,DATA} JSON to a query automatically
24+
var qry = deserializeJson(FileRead("staticArtifacts/testExtensionNameOrder.json"), false);
25+
exp
26+
27+
// Use a fresh reader to ensure no caching effects
28+
var extMetaReader = new services.ExtensionMetadataReader();
29+
extMetaReader.loadMeta(qry);
30+
var extQuery = extMetaReader.list();
31+
var names = [];
32+
for (var i=1; i <= extQuery.recordCount; i++) {
33+
arrayAppend(names, extQuery.name[i]);
34+
}
35+
var sortedNames = duplicate(names);
36+
arraySort(sortedNames, "textnocase");
37+
expect(names).toBe(sortedNames);
38+
});
39+
40+
it (title="test extension list is sorted by name (fresh reader)", body=function(){
41+
var dir = getDirectoryFromPath(getCurrentTemplatePath());
42+
var testVersions = deserializeJson(FileRead("staticArtifacts/testExtensionCoreVersions.json"), false);
43+
var extMetaReader = new services.ExtensionMetadataReader();
44+
extMetaReader.loadMeta(testVersions);
45+
var extQuery = extMetaReader.list();
46+
var names = [];
47+
for (var i=1; i <= extQuery.recordCount; i++) {
48+
arrayAppend(names, extQuery.name[i]);
49+
}
50+
var sortedNames = duplicate(names);
51+
arraySort(sortedNames, "textnocase");
52+
expect(names).toBe(sortedNames);
53+
});
54+
55+
it (title="test extension list is sorted by name (randomized input)", body=function(){
56+
var dir = getDirectoryFromPath(getCurrentTemplatePath());
57+
var testVersions = deserializeJson(FileRead("staticArtifacts/testExtensionCoreVersions.json"), false);
58+
// Randomize the order of the query rows
59+
var rows = [];
60+
for (var i=1; i <= testVersions.recordCount; i++) {
61+
arrayAppend(rows, i);
62+
}
63+
arrayShuffle(rows);
64+
var randomized = queryNew(testVersions.columnList);
65+
for (var idx in rows) {
66+
queryAddRow(randomized);
67+
for (var col in listToArray(testVersions.columnList)) {
68+
randomized[col][randomized.recordCount] = testVersions[col][rows[idx]];
69+
}
70+
}
71+
var extMetaReader = new services.ExtensionMetadataReader();
72+
extMetaReader.loadMeta(randomized);
73+
var extQuery = extMetaReader.list();
74+
var names = [];
75+
for (var i=1; i <= extQuery.recordCount; i++) {
76+
arrayAppend(names, extQuery.name[i]);
77+
}
78+
var sortedNames = duplicate(names);
79+
arraySort(sortedNames, "textnocase");
80+
expect(names).toBe(sortedNames);
81+
});
82+
83+
it (title="test extension list is sorted by name (reverse input)", body=function(){
84+
var dir = getDirectoryFromPath(getCurrentTemplatePath());
85+
var testVersions = deserializeJson(FileRead("staticArtifacts/testExtensionCoreVersions.json"), false);
86+
// Reverse the order of the query rows
87+
var rows = [];
88+
for (var i=testVersions.recordCount; i >= 1; i--) {
89+
arrayAppend(rows, i);
90+
}
91+
var reversed = queryNew(testVersions.columnList);
92+
for (var idx in rows) {
93+
queryAddRow(reversed);
94+
for (var col in listToArray(testVersions.columnList)) {
95+
reversed[col][reversed.recordCount] = testVersions[col][rows[idx]];
96+
}
97+
}
98+
var extMetaReader = new services.ExtensionMetadataReader();
99+
extMetaReader.loadMeta(reversed);
100+
var extQuery = extMetaReader.list();
101+
var names = [];
102+
for (var i=1; i <= extQuery.recordCount; i++) {
103+
arrayAppend(names, extQuery.name[i]);
104+
}
105+
var sortedNames = duplicate(names);
106+
arraySort(sortedNames, "textnocase");
107+
expect(names).toBe(sortedNames);
108+
});
109+
});
110+
}
111+
112+
// Fisher-Yates shuffle
113+
private function arrayShuffle(arr) {
114+
for (var i = arrayLen(arr); i > 1; i--) {
115+
var j = randRange(1, i);
116+
var tmp = arr[i];
117+
arr[i] = arr[j];
118+
arr[j] = tmp;
119+
}
120+
return arr;
121+
}
122+
}

0 commit comments

Comments
 (0)