From 8c05f37af372eaf06769e02cf6871e94f6a9d401 Mon Sep 17 00:00:00 2001 From: nerix Date: Thu, 14 Aug 2025 18:07:50 +0200 Subject: [PATCH] test: Add snapshot tests for imageuploader import/export (#6394) --- CHANGELOG.md | 2 +- .../snapshots/ImageUploader/Export/basic.json | 22 +++++ .../ImageUploader/Export/headers.json | 23 +++++ .../ImageUploader/Export/i-fourtf.json | 22 +++++ .../ImageUploader/Export/i-nuuls.json | 19 +++++ .../snapshots/ImageUploader/Export/imgur.json | 22 +++++ .../snapshots/ImageUploader/Export/s-ul.json | 19 +++++ .../snapshots/ImageUploader/Import/basic.json | 22 +++++ .../ImageUploader/Import/headers.json | 24 ++++++ .../ImageUploader/Import/i-fourtf.json | 22 +++++ .../ImageUploader/Import/i-nuuls.json | 19 +++++ .../snapshots/ImageUploader/Import/imgur.json | 22 +++++ .../snapshots/ImageUploader/Import/s-ul.json | 19 +++++ tests/src/ImageUploader.cpp | 85 +++++++++++++++++++ 14 files changed, 341 insertions(+), 1 deletion(-) create mode 100644 tests/snapshots/ImageUploader/Export/basic.json create mode 100644 tests/snapshots/ImageUploader/Export/headers.json create mode 100644 tests/snapshots/ImageUploader/Export/i-fourtf.json create mode 100644 tests/snapshots/ImageUploader/Export/i-nuuls.json create mode 100644 tests/snapshots/ImageUploader/Export/imgur.json create mode 100644 tests/snapshots/ImageUploader/Export/s-ul.json create mode 100644 tests/snapshots/ImageUploader/Import/basic.json create mode 100644 tests/snapshots/ImageUploader/Import/headers.json create mode 100644 tests/snapshots/ImageUploader/Import/i-fourtf.json create mode 100644 tests/snapshots/ImageUploader/Import/i-nuuls.json create mode 100644 tests/snapshots/ImageUploader/Import/imgur.json create mode 100644 tests/snapshots/ImageUploader/Import/s-ul.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 12fbf08a..046eaaec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ - Minor: Made commands searchable using the Settings dialog search bar. (#5891) - Minor: Added hotkey Action for opening account selector. (#6192) - Minor: Add a setting to change the emote and badge thumbnail size. (#6126) -- Minor: Add an import and export button to image uploader settings. (#6284) +- Minor: Add an import and export button to image uploader settings. (#6284, #6394) - Minor: Message character length label is now monospaced. (#6366) - Minor: Add a setting under Moderation -> Logs to customize the timestamp used for chat logs. (#6338) - Minor: Add a setting under Moderation -> Logs to use server timestamp from the message instead of the local clock time for logging. (#6346) diff --git a/tests/snapshots/ImageUploader/Export/basic.json b/tests/snapshots/ImageUploader/Export/basic.json new file mode 100644 index 00000000..4309188f --- /dev/null +++ b/tests/snapshots/ImageUploader/Export/basic.json @@ -0,0 +1,22 @@ +{ + "input": { + "deletionLink": "{more}", + "formField": "form", + "headers": "My-Header: Foo", + "link": "foo{bar}baz", + "url": "http://example.com" + }, + "output": { + "Body": "MultipartFormData", + "DeletionURL": "{more}", + "FileFormName": "form", + "Headers": { + "My-Header": "Foo" + }, + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "http://example.com", + "URL": "foo{bar}baz", + "Version": "1.0.0" + } +} diff --git a/tests/snapshots/ImageUploader/Export/headers.json b/tests/snapshots/ImageUploader/Export/headers.json new file mode 100644 index 00000000..c8a70468 --- /dev/null +++ b/tests/snapshots/ImageUploader/Export/headers.json @@ -0,0 +1,23 @@ +{ + "input": { + "deletionLink": "{more}", + "formField": "file", + "headers": "My-Header: Foo ; Bar : Baz ; KeyOnly\nX-My-Header:1", + "link": "foo{bar}baz", + "url": "https://example.com" + }, + "output": { + "Body": "MultipartFormData", + "DeletionURL": "{more}", + "FileFormName": "file", + "Headers": { + "My-Header": "Foo ; Bar : Baz ; KeyOnly", + "X-My-Header": "1" + }, + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://example.com", + "URL": "foo{bar}baz", + "Version": "1.0.0" + } +} diff --git a/tests/snapshots/ImageUploader/Export/i-fourtf.json b/tests/snapshots/ImageUploader/Export/i-fourtf.json new file mode 100644 index 00000000..4df3a85b --- /dev/null +++ b/tests/snapshots/ImageUploader/Export/i-fourtf.json @@ -0,0 +1,22 @@ +{ + "input": { + "deletionLink": "", + "formField": "file", + "headers": "Authorization: Basic XXXXXXXXXXXXXXX", + "link": "", + "url": "https://i.yourwebsite.com/upload" + }, + "output": { + "Body": "MultipartFormData", + "DeletionURL": "", + "FileFormName": "file", + "Headers": { + "Authorization": "Basic XXXXXXXXXXXXXXX" + }, + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://i.yourwebsite.com/upload", + "URL": "", + "Version": "1.0.0" + } +} diff --git a/tests/snapshots/ImageUploader/Export/i-nuuls.json b/tests/snapshots/ImageUploader/Export/i-nuuls.json new file mode 100644 index 00000000..ac538f52 --- /dev/null +++ b/tests/snapshots/ImageUploader/Export/i-nuuls.json @@ -0,0 +1,19 @@ +{ + "input": { + "deletionLink": "", + "formField": "attachment", + "headers": "", + "link": "", + "url": "https://i.nuuls.com/upload" + }, + "output": { + "Body": "MultipartFormData", + "DeletionURL": "", + "FileFormName": "attachment", + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://i.nuuls.com/upload", + "URL": "", + "Version": "1.0.0" + } +} diff --git a/tests/snapshots/ImageUploader/Export/imgur.json b/tests/snapshots/ImageUploader/Export/imgur.json new file mode 100644 index 00000000..5d5cd2e5 --- /dev/null +++ b/tests/snapshots/ImageUploader/Export/imgur.json @@ -0,0 +1,22 @@ +{ + "input": { + "deletionLink": "https://imgur.com/delete/{data.deletehash}", + "formField": "image", + "headers": "Authorization: Client-ID c898c0bb848ca39", + "link": "{data.link}", + "url": "https://api.imgur.com/3/image" + }, + "output": { + "Body": "MultipartFormData", + "DeletionURL": "https://imgur.com/delete/{data.deletehash}", + "FileFormName": "image", + "Headers": { + "Authorization": "Client-ID c898c0bb848ca39" + }, + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://api.imgur.com/3/image", + "URL": "{data.link}", + "Version": "1.0.0" + } +} diff --git a/tests/snapshots/ImageUploader/Export/s-ul.json b/tests/snapshots/ImageUploader/Export/s-ul.json new file mode 100644 index 00000000..12197aca --- /dev/null +++ b/tests/snapshots/ImageUploader/Export/s-ul.json @@ -0,0 +1,19 @@ +{ + "input": { + "deletionLink": "https://s-ul.eu/delete.php?file={filename}&key=XXXXXXXXXXXXXXX", + "formField": "file", + "headers": "", + "link": "{url}", + "url": "https://s-ul.eu/api/v1/upload?wizard=true&key=XXXXXXXXXXXXXXX" + }, + "output": { + "Body": "MultipartFormData", + "DeletionURL": "https://s-ul.eu/delete.php?file={filename}&key=XXXXXXXXXXXXXXX", + "FileFormName": "file", + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://s-ul.eu/api/v1/upload?wizard=true&key=XXXXXXXXXXXXXXX", + "URL": "{url}", + "Version": "1.0.0" + } +} diff --git a/tests/snapshots/ImageUploader/Import/basic.json b/tests/snapshots/ImageUploader/Import/basic.json new file mode 100644 index 00000000..a4b2f096 --- /dev/null +++ b/tests/snapshots/ImageUploader/Import/basic.json @@ -0,0 +1,22 @@ +{ + "input": { + "Body": "MultipartFormData", + "DeletionURL": "{more}", + "FileFormName": "form", + "Headers": { + "My-Header": "Foo" + }, + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "http://example.com", + "URL": "foo{bar}baz", + "Version": "1.0.0" + }, + "output": { + "deletionLink": "{more}", + "formField": "form", + "headers": "My-Header: Foo", + "link": "foo{bar}baz", + "url": "http://example.com" + } +} diff --git a/tests/snapshots/ImageUploader/Import/headers.json b/tests/snapshots/ImageUploader/Import/headers.json new file mode 100644 index 00000000..b2f9b537 --- /dev/null +++ b/tests/snapshots/ImageUploader/Import/headers.json @@ -0,0 +1,24 @@ +{ + "input": { + "Body": "MultipartFormData", + "DeletionURL": "{more}", + "FileFormName": "file", + "Headers": { + "Another": "header", + "My-Header": "Foo ; Bar : Baz ; KeyOnly", + "X-My-Header": "1" + }, + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://example.com", + "URL": "foo{bar}baz", + "Version": "1.0.0" + }, + "output": { + "deletionLink": "{more}", + "formField": "file", + "headers": "Another: header\nMy-Header: Foo ; Bar : Baz ; KeyOnly\nX-My-Header: 1", + "link": "foo{bar}baz", + "url": "https://example.com" + } +} diff --git a/tests/snapshots/ImageUploader/Import/i-fourtf.json b/tests/snapshots/ImageUploader/Import/i-fourtf.json new file mode 100644 index 00000000..f71ac4a3 --- /dev/null +++ b/tests/snapshots/ImageUploader/Import/i-fourtf.json @@ -0,0 +1,22 @@ +{ + "input": { + "Body": "MultipartFormData", + "DeletionURL": "", + "FileFormName": "file", + "Headers": { + "Authorization": "Basic XXXXXXXXXXXXXXX" + }, + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://i.yourwebsite.com/upload", + "URL": "", + "Version": "1.0.0" + }, + "output": { + "deletionLink": "", + "formField": "file", + "headers": "Authorization: Basic XXXXXXXXXXXXXXX", + "link": "", + "url": "https://i.yourwebsite.com/upload" + } +} diff --git a/tests/snapshots/ImageUploader/Import/i-nuuls.json b/tests/snapshots/ImageUploader/Import/i-nuuls.json new file mode 100644 index 00000000..8b2085c0 --- /dev/null +++ b/tests/snapshots/ImageUploader/Import/i-nuuls.json @@ -0,0 +1,19 @@ +{ + "input": { + "Body": "MultipartFormData", + "DeletionURL": "", + "FileFormName": "attachment", + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://i.nuuls.com/upload", + "URL": "", + "Version": "1.0.0" + }, + "output": { + "deletionLink": "", + "formField": "attachment", + "headers": "", + "link": "", + "url": "https://i.nuuls.com/upload" + } +} diff --git a/tests/snapshots/ImageUploader/Import/imgur.json b/tests/snapshots/ImageUploader/Import/imgur.json new file mode 100644 index 00000000..83102929 --- /dev/null +++ b/tests/snapshots/ImageUploader/Import/imgur.json @@ -0,0 +1,22 @@ +{ + "input": { + "Body": "MultipartFormData", + "DeletionURL": "https://imgur.com/delete/{data.deletehash}", + "FileFormName": "image", + "Headers": { + "Authorization": "Client-ID c898c0bb848ca39" + }, + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://api.imgur.com/3/image", + "URL": "{data.link}", + "Version": "1.0.0" + }, + "output": { + "deletionLink": "https://imgur.com/delete/{data.deletehash}", + "formField": "image", + "headers": "Authorization: Client-ID c898c0bb848ca39", + "link": "{data.link}", + "url": "https://api.imgur.com/3/image" + } +} diff --git a/tests/snapshots/ImageUploader/Import/s-ul.json b/tests/snapshots/ImageUploader/Import/s-ul.json new file mode 100644 index 00000000..33db5e1e --- /dev/null +++ b/tests/snapshots/ImageUploader/Import/s-ul.json @@ -0,0 +1,19 @@ +{ + "input": { + "Body": "MultipartFormData", + "DeletionURL": "https://s-ul.eu/delete.php?file={filename}&key=XXXXXXXXXXXXXXX", + "FileFormName": "file", + "Name": "Chatterino Image Uploader Settings", + "RequestMethod": "POST", + "RequestURL": "https://s-ul.eu/api/v1/upload?wizard=true&key=XXXXXXXXXXXXXXX", + "URL": "{url}", + "Version": "1.0.0" + }, + "output": { + "deletionLink": "https://s-ul.eu/delete.php?file={filename}&key=XXXXXXXXXXXXXXX", + "formField": "file", + "headers": "", + "link": "{url}", + "url": "https://s-ul.eu/api/v1/upload?wizard=true&key=XXXXXXXXXXXXXXX" + } +} diff --git a/tests/src/ImageUploader.cpp b/tests/src/ImageUploader.cpp index de2b4a5e..cbd11a6f 100644 --- a/tests/src/ImageUploader.cpp +++ b/tests/src/ImageUploader.cpp @@ -1,7 +1,10 @@ #include "singletons/ImageUploader.hpp" #include "common/network/NetworkResult.hpp" +#include "lib/Snapshot.hpp" +#include "mocks/BaseApplication.hpp" #include "Test.hpp" +#include "util/ImageUploader.hpp" #include #include @@ -12,6 +15,12 @@ #include #include +namespace { + +constexpr bool UPDATE_SNAPSHOTS = false; + +} // namespace + namespace chatterino::imageuploader::detail { TEST(ImageUploaderDetail_GetJsonValue, object) @@ -258,4 +267,80 @@ TEST(ImageUploaderDetail_GetLinkFromResponse, scalar) ASSERT_EQ(getLinkFromResponse(res("null"), "-{a.b}-"), "--"); } +class ImageUploaderTest : public ::testing::Test +{ +protected: + void configure() + { + this->app = std::make_unique(); + } + + void TearDown() override + { + this->app.reset(); + } + + std::unique_ptr app; +}; + +class ImportTest : public ImageUploaderTest, + public ::testing::WithParamInterface +{ +}; +TEST_P(ImportTest, Run) +{ + auto fixture = testlib::Snapshot::read("ImageUploader/Import", GetParam()); + + configure(); + + detail::importSettings(fixture->input().toObject(), *getSettings()); + + ASSERT_TRUE(fixture->run( + QJsonObject{ + {"url", getSettings()->imageUploaderUrl.getValue()}, + {"formField", getSettings()->imageUploaderFormField.getValue()}, + {"headers", getSettings()->imageUploaderHeaders.getValue()}, + {"link", getSettings()->imageUploaderLink.getValue()}, + {"deletionLink", + getSettings()->imageUploaderDeletionLink.getValue()}, + }, + UPDATE_SNAPSHOTS)); +} + +INSTANTIATE_TEST_SUITE_P( + ImageUploader, ImportTest, + testing::ValuesIn(testlib::Snapshot::discover("ImageUploader/Import"))); + +class ExportTest : public ImageUploaderTest, + public ::testing::WithParamInterface +{ +}; +TEST_P(ExportTest, Run) +{ + auto fixture = testlib::Snapshot::read("ImageUploader/Export", GetParam()); + + configure(); + + const auto input = fixture->input().toObject(); + getSettings()->imageUploaderUrl = input["url"].toString(); + getSettings()->imageUploaderFormField = input["formField"].toString(); + getSettings()->imageUploaderHeaders = input["headers"].toString(); + getSettings()->imageUploaderLink = input["link"].toString(); + getSettings()->imageUploaderDeletionLink = input["deletionLink"].toString(); + + auto output = detail::exportSettings(*getSettings()); + + ASSERT_TRUE(fixture->run(output, UPDATE_SNAPSHOTS)); +} + +INSTANTIATE_TEST_SUITE_P( + ImageUploader, ExportTest, + testing::ValuesIn(testlib::Snapshot::discover("ImageUploader/Export"))); + +// verify that all snapshots are included +TEST(ImageUploader, ImportExportIntegrity) +{ + ASSERT_FALSE(UPDATE_SNAPSHOTS); // make sure fixtures are actually tested +} + } // namespace chatterino::imageuploader::detail