fix(section): preserve user-defined subscription order in UCI and backend
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
#!/usr/bin/env bash
|
||||
set -eo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
TACHYON_LIB="${TACHYON_LIB:-$ROOT_DIR/tachyon/files/usr/lib}"
|
||||
WORK_DIR="$(mktemp -d)"
|
||||
|
||||
cleanup() {
|
||||
rm -rf "$WORK_DIR"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
fail() {
|
||||
printf 'FAIL: %s\n' "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 1. Create a mock uci state with 3 subscriptions in a section, where UCI file order is sub1, sub2, sub3,
|
||||
# but order options specify: sub2 (order 0), sub3 (order 1), sub1 (order 2)
|
||||
cat >"$WORK_DIR/uci.uc" <<'UCODE'
|
||||
let state = {
|
||||
tachyon: {
|
||||
sec1: {
|
||||
".name": "sec1",
|
||||
".type": "section",
|
||||
action: "connection",
|
||||
enabled: "1"
|
||||
},
|
||||
sub1: {
|
||||
".name": "sub1",
|
||||
".type": "subscription_url",
|
||||
section: "sec1",
|
||||
url: "https://example.com/third.txt",
|
||||
order: "2"
|
||||
},
|
||||
sub2: {
|
||||
".name": "sub2",
|
||||
".type": "subscription_url",
|
||||
section: "sec1",
|
||||
url: "https://example.com/first.txt",
|
||||
order: "0"
|
||||
},
|
||||
sub3: {
|
||||
".name": "sub3",
|
||||
".type": "subscription_url",
|
||||
section: "sec1",
|
||||
url: "https://example.com/second.txt",
|
||||
order: "1"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function cursor() {
|
||||
return {
|
||||
load: function(_package_name) {
|
||||
return true;
|
||||
},
|
||||
foreach: function(package_name, type_name, callback) {
|
||||
let pkg = state["" + package_name] || {};
|
||||
for (let name in pkg) {
|
||||
let section = pkg[name];
|
||||
if (section && section[".type"] == type_name) {
|
||||
callback(section);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return { cursor };
|
||||
UCODE
|
||||
|
||||
ucode -L "$WORK_DIR" -L "$TACHYON_LIB" -e '
|
||||
let connections = require("config.connections");
|
||||
let cursor = require("uci").cursor();
|
||||
|
||||
function assert(val, msg) {
|
||||
if (!val) {
|
||||
warn("Assertion failed: " + msg + "\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
let index = connections.item_index_from_cursor(cursor, "tachyon");
|
||||
connections.set_item_sections_from_cursor(cursor, "tachyon");
|
||||
|
||||
let sec = { ".name": "sec1", action: "connection" };
|
||||
let urls = connections.subscription_urls(sec);
|
||||
|
||||
assert(length(urls) == 3, "expected 3 subscription urls, got " + length(urls));
|
||||
assert(urls[0] == "https://example.com/first.txt", "expected first url at index 0, got " + urls[0]);
|
||||
assert(urls[1] == "https://example.com/second.txt", "expected second url at index 1, got " + urls[1]);
|
||||
assert(urls[2] == "https://example.com/third.txt", "expected third url at index 2, got " + urls[2]);
|
||||
'
|
||||
|
||||
# 2. Test fallback when items do not have order option: they should maintain their original order
|
||||
cat >"$WORK_DIR/uci_no_order.uc" <<'UCODE'
|
||||
let state = {
|
||||
tachyon: {
|
||||
sec1: {
|
||||
".name": "sec1",
|
||||
".type": "section",
|
||||
action: "connection",
|
||||
enabled: "1"
|
||||
},
|
||||
subA: {
|
||||
".name": "subA",
|
||||
".type": "subscription_url",
|
||||
section: "sec1",
|
||||
url: "https://example.com/alpha.txt"
|
||||
},
|
||||
subB: {
|
||||
".name": "subB",
|
||||
".type": "subscription_url",
|
||||
section: "sec1",
|
||||
url: "https://example.com/beta.txt"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function cursor() {
|
||||
return {
|
||||
load: function(_package_name) {
|
||||
return true;
|
||||
},
|
||||
foreach: function(package_name, type_name, callback) {
|
||||
let pkg = state["" + package_name] || {};
|
||||
for (let name in pkg) {
|
||||
let section = pkg[name];
|
||||
if (section && section[".type"] == type_name) {
|
||||
callback(section);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return { cursor };
|
||||
UCODE
|
||||
|
||||
ucode -L "$WORK_DIR" -L "$TACHYON_LIB" -e '
|
||||
let connections = require("config.connections");
|
||||
let cursor = require("uci_no_order").cursor();
|
||||
|
||||
function assert(val, msg) {
|
||||
if (!val) {
|
||||
warn("Assertion failed: " + msg + "\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
connections.set_item_sections_from_cursor(cursor, "tachyon");
|
||||
|
||||
let sec = { ".name": "sec1", action: "connection" };
|
||||
let urls = connections.subscription_urls(sec);
|
||||
|
||||
assert(length(urls) == 2, "expected 2 subscription urls");
|
||||
assert(urls[0] == "https://example.com/alpha.txt", "expected alpha first");
|
||||
assert(urls[1] == "https://example.com/beta.txt", "expected beta second");
|
||||
'
|
||||
|
||||
echo "PASS: subscription_section_order"
|
||||
Reference in New Issue
Block a user