feat: configurable OPDS download folder and filename format (#2571)
This commit is contained in:
@@ -43,5 +43,6 @@ add_subdirectory(release_json_parser)
|
||||
add_subdirectory(differential_rounding)
|
||||
add_subdirectory(hyphenation_eval)
|
||||
add_subdirectory(utf8_compose)
|
||||
add_subdirectory(opds_filename)
|
||||
add_subdirectory(minibidi_arabic)
|
||||
add_subdirectory(combining_marks)
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
add_executable(OpdsFilenameTest
|
||||
OpdsFilenameTest.cpp
|
||||
${REPO_ROOT}/src/util/OpdsFilename.cpp
|
||||
${REPO_ROOT}/src/util/StringUtils.cpp
|
||||
${REPO_ROOT}/lib/Utf8/Utf8.cpp
|
||||
)
|
||||
|
||||
target_include_directories(OpdsFilenameTest PRIVATE
|
||||
${REPO_ROOT}/src/util
|
||||
${REPO_ROOT}/lib/Utf8
|
||||
)
|
||||
|
||||
target_link_libraries(OpdsFilenameTest PRIVATE
|
||||
crosspoint_test_common
|
||||
GTest::gtest_main
|
||||
)
|
||||
|
||||
gtest_discover_tests(OpdsFilenameTest)
|
||||
@@ -0,0 +1,52 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "OpdsFilename.h"
|
||||
|
||||
namespace {
|
||||
|
||||
TEST(OpdsFilename, AuthorTitleIsDefaultOrder) {
|
||||
EXPECT_EQ(opdsBookFilename("J. Doe", "My Book", OpdsFilenameFormat::AuthorTitle), "J. Doe - My Book.epub");
|
||||
}
|
||||
|
||||
TEST(OpdsFilename, TitleAuthorSwapsOrder) {
|
||||
EXPECT_EQ(opdsBookFilename("J. Doe", "My Book", OpdsFilenameFormat::TitleAuthor), "My Book - J. Doe.epub");
|
||||
}
|
||||
|
||||
TEST(OpdsFilename, TitleOnlyIgnoresAuthor) {
|
||||
EXPECT_EQ(opdsBookFilename("J. Doe", "My Book", OpdsFilenameFormat::TitleOnly), "My Book.epub");
|
||||
}
|
||||
|
||||
TEST(OpdsFilename, EmptyAuthorCollapsesToTitleForEveryFormat) {
|
||||
EXPECT_EQ(opdsBookFilename("", "My Book", OpdsFilenameFormat::AuthorTitle), "My Book.epub");
|
||||
EXPECT_EQ(opdsBookFilename("", "My Book", OpdsFilenameFormat::TitleAuthor), "My Book.epub");
|
||||
EXPECT_EQ(opdsBookFilename("", "My Book", OpdsFilenameFormat::TitleOnly), "My Book.epub");
|
||||
}
|
||||
|
||||
TEST(OpdsFilename, IllegalCharactersAreSanitized) {
|
||||
// '/' ':' '*' '?' etc. are replaced with '_' by sanitizeFilename.
|
||||
EXPECT_EQ(opdsBookFilename("A/B", "C:D*E?", OpdsFilenameFormat::AuthorTitle), "A_B - C_D_E_.epub");
|
||||
}
|
||||
|
||||
TEST(OpdsFilename, EmptyAuthorAndTitleFallsBackToBook) {
|
||||
// sanitizeFilename returns "book" when nothing usable remains.
|
||||
EXPECT_EQ(opdsBookFilename("", "", OpdsFilenameFormat::AuthorTitle), "book.epub");
|
||||
EXPECT_EQ(opdsBookFilename("", "", OpdsFilenameFormat::TitleOnly), "book.epub");
|
||||
}
|
||||
|
||||
TEST(OpdsFilename, LongNameIsTruncatedToByteBudgetBeforeExtension) {
|
||||
// sanitizeFilename caps the base at 100 bytes; ".epub" is appended after.
|
||||
const std::string longTitle(200, 'a');
|
||||
const std::string result = opdsBookFilename("", longTitle, OpdsFilenameFormat::TitleOnly);
|
||||
EXPECT_EQ(result, std::string(100, 'a') + ".epub");
|
||||
EXPECT_EQ(result.size(), 105u);
|
||||
}
|
||||
|
||||
TEST(OpdsFilename, UnknownFormatValueFallsBackToAuthorTitle) {
|
||||
// Defensive: a persisted value outside the enum still yields a valid name.
|
||||
const auto bogus = static_cast<OpdsFilenameFormat>(99);
|
||||
EXPECT_EQ(opdsBookFilename("J. Doe", "My Book", bogus), "J. Doe - My Book.epub");
|
||||
}
|
||||
|
||||
} // namespace
|
||||
Reference in New Issue
Block a user