// BatchDialog unit tests: parseUrlBlob, expandWildcard, buildAddBatchParams. Lane GUI. // // Red when the clipboard parser stops deduping or starts letting non-URL lines through, // the wildcard expander mishandles zero-padding or a malformed/ambiguous range, or the // addBatch params start including an empty optional field or leak queueId into a // non-"queue" startMode. #include #include "dialogs/BatchDialog.hpp" using velox::gui::BatchDialog; class TstBatchDialog : public QObject { Q_OBJECT private slots: void parseUrlBlobDedupesAndFiltersNonUrls(); void parseUrlBlobTrimsAndSkipsBlankLines(); void expandWildcardSimpleRange(); void expandWildcardZeroPadded(); void expandWildcardNoRangeReturnsPatternIfUrl(); void expandWildcardMalformedRangeIsEmpty(); void expandWildcardAmbiguousMultiRangeIsEmpty(); void buildAddBatchParamsOmitsEmptyOptionalFields(); void buildAddBatchParamsQueueIdOnlyForQueueMode(); }; void TstBatchDialog::parseUrlBlobDedupesAndFiltersNonUrls() { const QString text = "https://example.test/a\nnot a url\nhttps://example.test/a\nhttps://example.test/b"; const QStringList urls = BatchDialog::parseUrlBlob(text); QCOMPARE(urls, QStringList({"https://example.test/a", "https://example.test/b"})); } void TstBatchDialog::parseUrlBlobTrimsAndSkipsBlankLines() { const QString text = " https://example.test/a \n\n\n \n"; QCOMPARE(BatchDialog::parseUrlBlob(text), QStringList({"https://example.test/a"})); } void TstBatchDialog::expandWildcardSimpleRange() { const QStringList urls = BatchDialog::expandWildcard("https://example.test/img{1..3}.jpg"); QCOMPARE(urls, QStringList({"https://example.test/img1.jpg", "https://example.test/img2.jpg", "https://example.test/img3.jpg"})); } void TstBatchDialog::expandWildcardZeroPadded() { const QStringList urls = BatchDialog::expandWildcard("https://example.test/img{08..10}.jpg"); QCOMPARE(urls, QStringList({"https://example.test/img08.jpg", "https://example.test/img09.jpg", "https://example.test/img10.jpg"})); } void TstBatchDialog::expandWildcardNoRangeReturnsPatternIfUrl() { QCOMPARE(BatchDialog::expandWildcard("https://example.test/a.jpg"), QStringList({"https://example.test/a.jpg"})); QVERIFY(BatchDialog::expandWildcard("not a url").isEmpty()); } void TstBatchDialog::expandWildcardMalformedRangeIsEmpty() { QVERIFY(BatchDialog::expandWildcard("https://example.test/img{5..1}.jpg").isEmpty()); } void TstBatchDialog::expandWildcardAmbiguousMultiRangeIsEmpty() { QVERIFY(BatchDialog::expandWildcard("https://example.test/{1..2}/img{1..3}.jpg").isEmpty()); } void TstBatchDialog::buildAddBatchParamsOmitsEmptyOptionalFields() { const QJsonObject params = BatchDialog::buildAddBatchParams({"https://example.test/a"}, QString(), QString(), "now"); const QJsonObject defaults = params.value("defaults").toObject(); QVERIFY(!defaults.contains("categoryId")); QVERIFY(!defaults.contains("queueId")); QCOMPARE(params.value("items").toArray().size(), 1); } void TstBatchDialog::buildAddBatchParamsQueueIdOnlyForQueueMode() { const QJsonObject queued = BatchDialog::buildAddBatchParams({"https://example.test/a"}, QString(), "q1", "queue"); QCOMPARE(queued.value("defaults").toObject().value("queueId").toString(), QStringLiteral("q1")); const QJsonObject notQueued = BatchDialog::buildAddBatchParams({"https://example.test/a"}, QString(), "q1", "now"); QVERIFY(!notQueued.value("defaults").toObject().contains("queueId")); } QTEST_MAIN(TstBatchDialog) #include "tst_batchdialog.moc"