From 4edd74e8b74417772a3fb10307e0a8ffffb6f147 Mon Sep 17 00:00:00 2001 From: Paul Vogel Date: Fri, 16 Oct 2026 11:13:35 +0200 Subject: [PATCH 1/2] add unit tests for mod endpoints --- tests/Unit/Client/ClientTestCase.php | 15 + tests/Unit/Client/CurseForgeAPIClientTest.php | 188 ++ .../Unit/Client/Fixtures/getFeaturedMods.json | 1589 +++++++++++++++++ tests/Unit/Client/Fixtures/getMod.json | 287 +++ .../Client/Fixtures/getModDescription.json | 3 + tests/Unit/Client/Fixtures/getMods.json | 826 +++++++++ tests/Unit/Client/Fixtures/searchMods.json | 535 ++++++ 7 files changed, 3443 insertions(+) create mode 100644 tests/Unit/Client/Fixtures/getFeaturedMods.json create mode 100644 tests/Unit/Client/Fixtures/getMod.json create mode 100644 tests/Unit/Client/Fixtures/getModDescription.json create mode 100644 tests/Unit/Client/Fixtures/getMods.json create mode 100644 tests/Unit/Client/Fixtures/searchMods.json diff --git a/tests/Unit/Client/ClientTestCase.php b/tests/Unit/Client/ClientTestCase.php index 0ab7ebf..62b45d6 100644 --- a/tests/Unit/Client/ClientTestCase.php +++ b/tests/Unit/Client/ClientTestCase.php @@ -101,6 +101,21 @@ protected function assertGetRequest(string $path, array $query = [], int $index } } + /** + * Assert that a recorded request is a POST request to the given path with the given JSON body + * @param string $path e.g. /v1/mods + * @param array $body expected JSON body, decoded as associative array + * @param int $index + * @return void + */ + protected function assertPostRequest(string $path, array $body, int $index = 0): void + { + $request = $this->getRequest($index); + $this->assertSame("POST", $request->getMethod()); + $this->assertSame($path, $request->getUri()->getPath()); + $this->assertSame($body, json_decode((string)$request->getBody(), true)); + } + /** * Assert the number of requests that were sent * @param int $count diff --git a/tests/Unit/Client/CurseForgeAPIClientTest.php b/tests/Unit/Client/CurseForgeAPIClientTest.php index 1d65ebc..5224787 100644 --- a/tests/Unit/Client/CurseForgeAPIClientTest.php +++ b/tests/Unit/Client/CurseForgeAPIClientTest.php @@ -3,7 +3,13 @@ namespace Aternos\CurseForgeApi\Tests\Unit\Client; use Aternos\CurseForgeApi\ApiException; +use Aternos\CurseForgeApi\Client\Mod; +use Aternos\CurseForgeApi\Client\Options\ModSearchOptions; use Aternos\CurseForgeApi\Configuration; +use Aternos\CurseForgeApi\Model\ModLoaderType; +use Aternos\CurseForgeApi\Model\ModSearchSortField; +use Aternos\CurseForgeApi\Model\PremiumType; +use Aternos\CurseForgeApi\Model\SortOrder; use GuzzleHttp\Client; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; @@ -96,4 +102,186 @@ public function testBooleanQueryParametersAreSentAsStrings(): void $this->assertGetRequest("/v1/categories", ["gameId" => "432", "classesOnly" => "true"]); } + + /** + * @throws ApiException + */ + public function testSearchMods(): void + { + $client = $this->createClient([new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/searchMods.json"))]); + + $mods = $client->searchMods((new ModSearchOptions(432))->setSearchFilter("mclogs")->setPageSize(2)); + + $this->assertGetRequest("/v1/mods/search", ["gameId" => "432", "index" => "0", "pageSize" => "2", "searchFilter" => "mclogs"]); + $this->assertCount(2, $mods); + $this->assertContainsOnlyInstancesOf(Mod::class, $mods->getResults()); + $this->assertSame(2, $mods->getPagination()->getTotalCount()); + $this->assertSame("mclo-gs", $mods[0]->getData()->getSlug()); + $this->assertSame("mclogs", $mods[1]->getData()->getSlug()); + } + + /** + * @throws ApiException + */ + public function testSearchModsSendsAllOptions(): void + { + $client = $this->createClient([new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/searchMods.json"))]); + $options = (new ModSearchOptions(432, 10, 20)) + ->setClassId(6) + ->setCategoryIds([435, 436]) + ->setGameVersions(["1.21.1", "1.20.1"]) + ->setSearchFilter("mclogs") + ->setSortField(ModSearchSortField::POPULARITY) + ->setSortOrder(SortOrder::DESCENDING) + ->setModLoaderTypes([ModLoaderType::FORGE, ModLoaderType::FABRIC]) + ->setGameVersionTypeId(77784) + ->setAuthorId(100) + ->setPrimaryAuthorId(101) + ->setPremiumType(PremiumType::FREE) + ->setSlug("mclo-gs") + ->setClientCompatible(true) + ->setModsSearchEnhancedFeatures(1); + + $client->searchMods($options); + + $this->assertGetRequest("/v1/mods/search", [ + "gameId" => "432", + "index" => "10", + "pageSize" => "20", + "classId" => "6", + "categoryIds" => "[435,436]", + "gameVersions" => '["1.21.1","1.20.1"]', + "searchFilter" => "mclogs", + "sortField" => "2", + "sortOrder" => "desc", + "modLoaderTypes" => "[1,4]", + "gameVersionTypeId" => "77784", + "authorId" => "100", + "primaryAuthorId" => "101", + "PremiumType" => "2", + "slug" => "mclo-gs", + "clientCompatible" => "true", + "modsSearchEnhancedFeatures" => "1", + ]); + } + + /** + * @throws ApiException + */ + public function testSearchModsLimitsPageSize(): void + { + $client = $this->createClient([ + new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/searchMods.json")), + new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/searchMods.json")), + ]); + + $client->searchMods(new ModSearchOptions(432, 0, 100)); + $client->searchMods(new ModSearchOptions(432, 9990, 50)); + + $this->assertGetRequest("/v1/mods/search", ["index" => "0", "pageSize" => "50"]); + $this->assertGetRequest("/v1/mods/search", ["index" => "9990", "pageSize" => "10"], 1); + } + + /** + * @throws ApiException + */ + public function testGetMod(): void + { + $client = $this->createClient([new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/getMod.json"))]); + + $mod = $client->getMod(420561); + + $this->assertGetRequest("/v1/mods/420561"); + $this->assertSame(420561, $mod->getData()->getId()); + $this->assertSame("mclo-gs", $mod->getData()->getSlug()); + $this->assertSame("Mclogs - mclo.gs", $mod->getData()->getName()); + $this->assertSame(6, $mod->getData()->getClassId()); + $this->assertSame(435, $mod->getData()->getPrimaryCategoryId()); + } + + /** + * @throws ApiException + */ + public function testGetMods(): void + { + $client = $this->createClient([new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/getMods.json"))]); + + $mods = $client->getMods([420561, 278568, 715033]); + + $this->assertPostRequest("/v1/mods", ["modIds" => [420561, 278568, 715033], "devModIds" => [], "filterPcOnly" => null]); + $this->assertCount(3, $mods); + $this->assertContainsOnlyInstancesOf(Mod::class, $mods); + $this->assertSame(["mclo-gs", "mclogs", "motd-gg"], array_map(fn(Mod $mod) => $mod->getData()->getSlug(), $mods)); + } + + /** + * @throws ApiException + */ + public function testGetModsWithDevModIdsAndFilterPcOnly(): void + { + $client = $this->createClient([new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/getMods.json"))]); + + $client->getMods([420561], [278568], true); + + $this->assertPostRequest("/v1/mods", ["modIds" => [420561], "devModIds" => [278568], "filterPcOnly" => true]); + } + + /** + * @throws ApiException + */ + public function testGetFeaturedMods(): void + { + $client = $this->createClient([new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/getFeaturedMods.json"))]); + + $featuredMods = $client->getFeaturedMods(432); + + $this->assertPostRequest("/v1/mods/featured", ["gameId" => 432, "excludedModIds" => [], "gameVersionTypeId" => null]); + $slugs = fn(array $mods) => array_map(fn(Mod $mod) => $mod->getData()->getSlug(), $mods); + $this->assertSame(["complex-cobblemon", "cobblemon-gg"], $slugs($featuredMods->getFeatured())); + $this->assertSame(["geckolib", "jei"], $slugs($featuredMods->getPopular())); + $this->assertSame(["aspects-reclaimed", "pixelcrystaloptimizer"], $slugs($featuredMods->getRecentlyUpdated())); + } + + /** + * @throws ApiException + */ + public function testGetFeaturedModsWithOptions(): void + { + $client = $this->createClient([new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/getFeaturedMods.json"))]); + + $client->getFeaturedMods(432, [420561], 77784, false); + + $this->assertPostRequest("/v1/mods/featured", [ + "gameId" => 432, + "excludedModIds" => [420561], + "gameVersionTypeId" => 77784, + "clientCompatible" => false, + ]); + } + + /** + * @throws ApiException + */ + public function testGetModDescription(): void + { + $client = $this->createClient([new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/getModDescription.json"))]); + + $description = $client->getModDescription(420561); + + $this->assertGetRequest("/v1/mods/420561/description"); + $this->assertArrayNotHasKey("lang", $this->getQuery()); + $this->assertStringStartsWith('
', $description); + } + + /** + * @throws ApiException + */ + public function testGetModDescriptionWithLanguage(): void + { + $client = $this->createClient([new Response(200, [], file_get_contents(__DIR__ . "/Fixtures/getModDescription.json"))]); + + $client->getModDescription(420561, "de"); + + $this->assertGetRequest("/v1/mods/420561/description", ["lang" => "de"]); + } } diff --git a/tests/Unit/Client/Fixtures/getFeaturedMods.json b/tests/Unit/Client/Fixtures/getFeaturedMods.json new file mode 100644 index 0000000..a1f881c --- /dev/null +++ b/tests/Unit/Client/Fixtures/getFeaturedMods.json @@ -0,0 +1,1589 @@ +{ + "data": { + "featured": [ + { + "screenshots": [], + "id": 1360926, + "gameId": 432, + "name": "Cobblemon SMP - The #1 Legendary Pokemon Adventure ", + "slug": "complex-cobblemon", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/modpacks/complex-cobblemon", + "wikiUrl": "https://www.mc-complex.com/cobblemon/", + "issuesUrl": "", + "sourceUrl": null + }, + "summary": "✅💯 The Ultimate Pokémon Academy! 💯✅ Catch, train, and level your Pokémon with friends in Cobblemon. Enjoy mods included in cobbleverse, Level up, and grow all your mons —starting your cobblemon verse journey! The Best Optimized RPG MMO Experience atm!.🌟", + "status": 4, + "downloadCount": 1338519, + "favoriteCount": 0, + "isFeatured": true, + "primaryCategoryId": 4476, + "categories": [ + { + "id": 4476, + "gameId": 432, + "name": "Exploration", + "slug": "exploration", + "url": "https://www.curseforge.com/minecraft/modpacks/exploration", + "iconUrl": "https://media.forgecdn.net/avatars/14/486/635596815896417213.png", + "dateModified": "2015-02-16T17:06:29.69Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + }, + { + "id": 4482, + "gameId": 432, + "name": "Extra Large", + "slug": "extra-large", + "url": "https://www.curseforge.com/minecraft/modpacks/extra-large", + "iconUrl": "https://media.forgecdn.net/avatars/14/472/635596760403562826.png", + "dateModified": "2015-02-16T15:34:00.357Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + }, + { + "id": 4478, + "gameId": 432, + "name": "Quests", + "slug": "quests", + "url": "https://www.curseforge.com/minecraft/modpacks/quests", + "iconUrl": "https://media.forgecdn.net/avatars/14/487/635596816137981263.png", + "dateModified": "2015-02-16T17:06:53.797Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + }, + { + "id": 4473, + "gameId": 432, + "name": "Magic", + "slug": "magic", + "url": "https://www.curseforge.com/minecraft/modpacks/magic", + "iconUrl": "https://media.forgecdn.net/avatars/14/474/635596760578719019.png", + "dateModified": "2015-02-16T15:34:17.873Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + }, + { + "id": 4475, + "gameId": 432, + "name": "Adventure and RPG", + "slug": "adventure-and-rpg", + "url": "https://www.curseforge.com/minecraft/modpacks/adventure-and-rpg", + "iconUrl": "https://media.forgecdn.net/avatars/14/480/635596775049811800.png", + "dateModified": "2015-02-16T15:58:24.98Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + } + ], + "classId": 4471, + "authors": [ + { + "id": 112598432, + "name": "FrankCG", + "url": "https://www.curseforge.com/members/frankcg", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/xarth/404_user_70x70.png" + } + ], + "logo": { + "id": 1497387, + "modId": 1360926, + "title": "638972731634654794.webp", + "description": "", + "thumbnailUrl": "", + "url": "https://media.forgecdn.net/avatars/1497/387/638972731634654794.webp" + }, + "mainFileId": 8267500, + "latestFiles": [ + { + "id": 8267500, + "gameId": 432, + "modId": 1360926, + "isAvailable": true, + "displayName": "complexcobblemon-v1.7.3a.zip", + "fileName": "complexcobblemon-v1.7.3a.zip", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "472ea14ac4fea5dd2ea8f2b7528e91be8c67651e", + "algo": 1 + }, + { + "value": "273cd3273bdd48207f1f361ea35ec8be", + "algo": 2 + } + ], + "fileDate": "2026-06-17T16:55:06.51Z", + "fileLength": 25874896, + "downloadCount": 405417, + "fileSizeOnDisk": 26163945, + "downloadUrl": null, + "gameVersions": [ + "Fabric", + "1.21.1" + ], + "sortableGameVersions": [ + { + "gameVersionName": "Fabric", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-09-01T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "1.21.1", + "gameVersionPadded": "0000000001.0000000021.0000000001", + "gameVersion": "1.21.1", + "gameVersionReleaseDate": "2024-08-08T15:17:53.787Z", + "gameVersionTypeId": 77784 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 3672964330, + "modules": [ + { + "name": "manifest.json", + "fingerprint": 3571878451 + }, + { + "name": "modlist.html", + "fingerprint": 729137995 + }, + { + "name": "overrides", + "fingerprint": 3007385705 + } + ] + }, + { + "id": 8912066, + "gameId": 432, + "modId": 1360926, + "isAvailable": true, + "displayName": "complexcobblemon-v1.8.1.zip", + "fileName": "complexcobblemon-v1.8.1.zip", + "releaseType": 2, + "fileStatus": 4, + "hashes": [ + { + "value": "57b2df67ee5f3ccb1fbdeb3ca08d229f5f344642", + "algo": 1 + }, + { + "value": "a989b755c3f7c68151ec86b6bbb2f953", + "algo": 2 + } + ], + "fileDate": "2026-09-18T14:13:14.653Z", + "fileLength": 25868428, + "downloadCount": 0, + "fileSizeOnDisk": 26163945, + "downloadUrl": null, + "gameVersions": [ + "Fabric", + "1.21.1" + ], + "sortableGameVersions": [ + { + "gameVersionName": "Fabric", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-09-01T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "1.21.1", + "gameVersionPadded": "0000000001.0000000021.0000000001", + "gameVersion": "1.21.1", + "gameVersionReleaseDate": "2024-08-08T15:17:53.787Z", + "gameVersionTypeId": 77784 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 1152505002, + "modules": [ + { + "name": "manifest.json", + "fingerprint": 368066158 + }, + { + "name": "modlist.html", + "fingerprint": 729137995 + }, + { + "name": "overrides", + "fingerprint": 3007385705 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "1.21.1", + "fileId": 8912066, + "filename": "complexcobblemon-v1.8.1.zip", + "releaseType": 2, + "gameVersionTypeId": 77784, + "modLoader": 4 + }, + { + "gameVersion": "1.21.1", + "fileId": 8267500, + "filename": "complexcobblemon-v1.7.3a.zip", + "releaseType": 1, + "gameVersionTypeId": 77784, + "modLoader": 4 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2025-10-08T09:50:14.71Z", + "dateModified": "2026-10-03T19:34:05.773Z", + "dateReleased": "2026-09-18T14:13:14.653Z", + "allowModDistribution": false, + "gamePopularityRank": 3828, + "isAvailable": true, + "thumbsUpCount": 0, + "socialLinks": [ + { + "type": 2, + "url": "http://discord.gg/complexpixel" + }, + { + "type": 3, + "url": "https://www.mc-complex.com/cobblemon/" + } + ], + "featuredProjectTag": 1 + }, + { + "screenshots": [ + { + "id": 1002305, + "modId": 1011903, + "title": "Cobblemon GG", + "description": "A raid happening in Cobblemon GG Minecraft server.", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1002/305/310/172/cobblemon-gg-raid.png", + "url": "https://media.forgecdn.net/attachments/1002/305/cobblemon-gg-raid.png" + }, + { + "id": 1358269, + "modId": 1011903, + "title": "Elite 4", + "description": "Defeat the Elite 4!", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1358/269/310/172/elite4.png", + "url": "https://media.forgecdn.net/attachments/1358/269/elite4.png" + }, + { + "id": 1358270, + "modId": 1011903, + "title": "Events & Skins", + "description": "Seasonal Events and Skins!", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1358/270/310/172/summer.png", + "url": "https://media.forgecdn.net/attachments/1358/270/summer.png" + } + ], + "id": 1011903, + "gameId": 432, + "name": "Cobblemon.gg - #1 Cobblemon Experience - Game of The Year", + "slug": "cobblemon-gg", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/modpacks/cobblemon-gg", + "wikiUrl": "https://cobblemon.gg/wiki", + "issuesUrl": null, + "sourceUrl": null + }, + "summary": "🔥 Welcome to Elite Trainer Cobblemon - Master Multiverse. Cobblemon.gg is your premier destination for an unparalleled Minecraft – Cobblemon – Pokémon experience!", + "status": 4, + "downloadCount": 647215, + "favoriteCount": 0, + "isFeatured": true, + "primaryCategoryId": 4476, + "categories": [ + { + "id": 4484, + "gameId": 432, + "name": "Multiplayer", + "slug": "multiplayer", + "url": "https://www.curseforge.com/minecraft/modpacks/multiplayer", + "iconUrl": "https://media.forgecdn.net/avatars/14/481/635596792838491141.png", + "dateModified": "2015-02-16T16:28:03.85Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + }, + { + "id": 4476, + "gameId": 432, + "name": "Exploration", + "slug": "exploration", + "url": "https://www.curseforge.com/minecraft/modpacks/exploration", + "iconUrl": "https://media.forgecdn.net/avatars/14/486/635596815896417213.png", + "dateModified": "2015-02-16T17:06:29.69Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + }, + { + "id": 4482, + "gameId": 432, + "name": "Extra Large", + "slug": "extra-large", + "url": "https://www.curseforge.com/minecraft/modpacks/extra-large", + "iconUrl": "https://media.forgecdn.net/avatars/14/472/635596760403562826.png", + "dateModified": "2015-02-16T15:34:00.357Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + }, + { + "id": 4478, + "gameId": 432, + "name": "Quests", + "slug": "quests", + "url": "https://www.curseforge.com/minecraft/modpacks/quests", + "iconUrl": "https://media.forgecdn.net/avatars/14/487/635596816137981263.png", + "dateModified": "2015-02-16T17:06:53.797Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + }, + { + "id": 4473, + "gameId": 432, + "name": "Magic", + "slug": "magic", + "url": "https://www.curseforge.com/minecraft/modpacks/magic", + "iconUrl": "https://media.forgecdn.net/avatars/14/474/635596760578719019.png", + "dateModified": "2015-02-16T15:34:17.873Z", + "isClass": false, + "classId": 4471, + "parentCategoryId": 4471 + } + ], + "classId": 4471, + "authors": [ + { + "id": 131747165, + "name": "hihihih565", + "url": "https://www.curseforge.com/members/hihihih565", + "avatarUrl": "https://media.forgecdn.net/avatars/1479/113/638961366358985339.png" + } + ], + "logo": { + "id": 2089493, + "modId": 1011903, + "title": "639266477707573992.webp", + "description": "", + "thumbnailUrl": "", + "url": "https://media.forgecdn.net/avatars/2089/493/639266477707573992.webp" + }, + "mainFileId": 9154852, + "latestFiles": [ + { + "id": 9154852, + "gameId": 432, + "modId": 1011903, + "isAvailable": true, + "displayName": "Cobblemon.gg 3.9", + "fileName": "Cobblemon.gg-3.9.zip", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "8ddb9f363ab6d13007ba322bc68ba625ebb404ac", + "algo": 1 + }, + { + "value": "a00567304758714a94fe37855fdbfae3", + "algo": 2 + } + ], + "fileDate": "2026-10-13T08:14:05.707Z", + "fileLength": 369284168, + "downloadCount": 2822, + "fileSizeOnDisk": 379271852, + "downloadUrl": null, + "gameVersions": [ + "Fabric", + "1.21.1" + ], + "sortableGameVersions": [ + { + "gameVersionName": "Fabric", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-09-01T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "1.21.1", + "gameVersionPadded": "0000000001.0000000021.0000000001", + "gameVersion": "1.21.1", + "gameVersionReleaseDate": "2024-08-08T15:17:53.787Z", + "gameVersionTypeId": 77784 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 2483059344, + "modules": [ + { + "name": "manifest.json", + "fingerprint": 2291583243 + }, + { + "name": "modlist.html", + "fingerprint": 2328433721 + }, + { + "name": "overrides", + "fingerprint": 2561831315 + }, + { + "name": "profileImage", + "fingerprint": 367839310 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "1.21.1", + "fileId": 9154852, + "filename": "Cobblemon.gg-3.9.zip", + "releaseType": 1, + "gameVersionTypeId": 77784, + "modLoader": 4 + }, + { + "gameVersion": "1.20.1", + "fileId": 5859506, + "filename": "Cobblemon GG 1.1.3.zip", + "releaseType": 1, + "gameVersionTypeId": 75125, + "modLoader": 4 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2024-10-29T15:00:51.4Z", + "dateModified": "2026-10-14T05:50:01.39Z", + "dateReleased": "2026-10-13T08:14:05.707Z", + "allowModDistribution": false, + "gamePopularityRank": 5456, + "isAvailable": true, + "thumbsUpCount": 0, + "socialLinks": [ + { + "type": 3, + "url": "https://cobblemon.gg/" + }, + { + "type": 2, + "url": "https://discord.gg/cobblemongg" + } + ], + "featuredProjectTag": 1 + } + ], + "popular": [ + { + "screenshots": [], + "id": 388172, + "gameId": 432, + "name": "GeckoLib", + "slug": "geckolib", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/mc-mods/geckolib", + "wikiUrl": "https://github.com/bernie-g/geckolib/wiki", + "issuesUrl": "https://github.com/bernie-g/geckolib/issues", + "sourceUrl": "https://github.com/bernie-g/geckolib" + }, + "summary": "A 3D animation library for entities, blocks, items, armor, and more!", + "status": 4, + "downloadCount": 409094041, + "favoriteCount": 0, + "isFeatured": false, + "primaryCategoryId": 421, + "categories": [ + { + "id": 421, + "gameId": 432, + "name": "API and Library", + "slug": "library-api", + "url": "https://www.curseforge.com/minecraft/mc-mods/library-api", + "iconUrl": "https://media.forgecdn.net/avatars/6/36/635351496947765531.png", + "dateModified": "2014-05-23T03:21:44.06Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 6 + } + ], + "classId": 6, + "authors": [ + { + "id": 100005756, + "name": "Gecko", + "url": "https://www.curseforge.com/members/gecko", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/10cc0485-6e73-446c-8d32-3b58c4aa0b67-profile_image-150x150.png" + }, + { + "id": 102710925, + "name": "EliotL", + "url": "https://www.curseforge.com/members/eliotl", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/eliotl-profile_image-51a2d982149a680c-150x150.png" + } + ], + "logo": { + "id": 1081393, + "modId": 388172, + "title": "638621132937140582.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/1081/393/256/256/638621132937140582.png", + "url": "https://media.forgecdn.net/avatars/1081/393/638621132937140582.png" + }, + "mainFileId": 8945638, + "latestFiles": [ + { + "id": 3188481, + "gameId": 432, + "modId": 388172, + "isAvailable": true, + "displayName": "forge-1.12.2-geckolib-3.0.0-beta.5.jar", + "fileName": "forge-1.12.2-geckolib-3.0.0-beta.5.jar", + "releaseType": 2, + "fileStatus": 4, + "hashes": [ + { + "value": "ca7035f68cd4431a384262be7e684a7f3b596e79", + "algo": 1 + }, + { + "value": "3d0eb295fd8e499f76b549e085edd8c0", + "algo": 2 + } + ], + "fileDate": "2021-02-01T04:47:52.663Z", + "fileLength": 3679964, + "downloadCount": 9472, + "downloadUrl": "https://edge.forgecdn.net/files/3188/481/forge-1.12.2-geckolib-3.0.0-beta.5.jar", + "gameVersions": [ + "1.12.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.12.2", + "gameVersionPadded": "0000000001.0000000012.0000000002", + "gameVersion": "1.12.2", + "gameVersionReleaseDate": "2017-09-18T05:00:00Z", + "gameVersionTypeId": 628 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 3999757708, + "modules": [ + { + "name": "META-INF", + "fingerprint": 1689384183 + }, + { + "name": "software", + "fingerprint": 3577279111 + }, + { + "name": "assets", + "fingerprint": 3871847775 + }, + { + "name": "geckolib.png", + "fingerprint": 3653859787 + }, + { + "name": "mcmod.info", + "fingerprint": 2312685867 + }, + { + "name": "pack.mcmeta", + "fingerprint": 3380797652 + }, + { + "name": "org", + "fingerprint": 3807885378 + } + ] + }, + { + "id": 3197366, + "gameId": 432, + "modId": 388172, + "isAvailable": true, + "displayName": "forge-1.12.2-geckolib-3.0.0-beta.7.jar", + "fileName": "forge-1.12.2-geckolib-3.0.0-beta.7.jar", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "16bf1532493261cc2a02fdff6ef836c30a6ed0c1", + "algo": 1 + }, + { + "value": "7f787fe1b332596f4c669228e63d504b", + "algo": 2 + } + ], + "fileDate": "2021-02-08T22:17:38.367Z", + "fileLength": 3680008, + "downloadCount": 450161, + "downloadUrl": "https://edge.forgecdn.net/files/3197/366/forge-1.12.2-geckolib-3.0.0-beta.7.jar", + "gameVersions": [ + "1.12.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.12.2", + "gameVersionPadded": "0000000001.0000000012.0000000002", + "gameVersion": "1.12.2", + "gameVersionReleaseDate": "2017-09-18T05:00:00Z", + "gameVersionTypeId": 628 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 3396664737, + "modules": [ + { + "name": "META-INF", + "fingerprint": 3614830990 + }, + { + "name": "software", + "fingerprint": 3225287877 + }, + { + "name": "assets", + "fingerprint": 3871847775 + }, + { + "name": "geckolib.png", + "fingerprint": 3653859787 + }, + { + "name": "mcmod.info", + "fingerprint": 2312685867 + }, + { + "name": "pack.mcmeta", + "fingerprint": 3380797652 + }, + { + "name": "org", + "fingerprint": 3807885378 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "26.3", + "fileId": 8945638, + "filename": "geckolib-neoforge-26.3-5.5.7.jar", + "releaseType": 1, + "gameVersionTypeId": 88556, + "modLoader": 6 + }, + { + "gameVersion": "26.3", + "fileId": 8945634, + "filename": "geckolib-forge-26.3-5.5.7.jar", + "releaseType": 1, + "gameVersionTypeId": 88556, + "modLoader": 1 + }, + { + "gameVersion": "26.3", + "fileId": 8945630, + "filename": "geckolib-fabric-26.3-5.5.7.jar", + "releaseType": 1, + "gameVersionTypeId": 88556, + "modLoader": 4 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2020-06-08T21:02:20.903Z", + "dateModified": "2026-09-22T08:18:54.967Z", + "dateReleased": "2026-09-22T08:02:22.297Z", + "allowModDistribution": true, + "gamePopularityRank": 1, + "isAvailable": true, + "thumbsUpCount": 0, + "socialLinks": [ + { + "type": 2, + "url": "https://discord.gg/pPEqBgJtZW" + } + ], + "featuredProjectTag": 0 + }, + { + "screenshots": [ + { + "id": 2042808, + "modId": 238222, + "title": "image-attachment_69545b4f-0e02-40ba-b855-d407b8e1dcac.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/2042/808/310/172/ytuxxol-png.png", + "url": "https://media.forgecdn.net/attachments/2042/808/ytuxxol-png.png" + } + ], + "id": 238222, + "gameId": 432, + "name": "Just Enough Items (JEI)", + "slug": "jei", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/mc-mods/jei", + "wikiUrl": "", + "issuesUrl": "https://github.com/mezz/JustEnoughItems/issues?q=is%3Aissue", + "sourceUrl": "https://github.com/mezz/JustEnoughItems" + }, + "summary": "View Items and Recipes", + "status": 4, + "downloadCount": 631444910, + "favoriteCount": 0, + "isFeatured": false, + "primaryCategoryId": 423, + "categories": [ + { + "id": 423, + "gameId": 432, + "name": "Map and Information", + "slug": "map-information", + "url": "https://www.curseforge.com/minecraft/mc-mods/map-information", + "iconUrl": "https://media.forgecdn.net/avatars/6/38/635351497437388438.png", + "dateModified": "2014-05-08T17:42:23.74Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 6 + }, + { + "id": 421, + "gameId": 432, + "name": "API and Library", + "slug": "library-api", + "url": "https://www.curseforge.com/minecraft/mc-mods/library-api", + "iconUrl": "https://media.forgecdn.net/avatars/6/36/635351496947765531.png", + "dateModified": "2014-05-23T03:21:44.06Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 6 + } + ], + "classId": 6, + "authors": [ + { + "id": 17072262, + "name": "mezz", + "url": "https://www.curseforge.com/members/mezz", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/ce4a8a5fe354959b-profile_image-150x150.png" + } + ], + "logo": { + "id": 29069, + "modId": 238222, + "title": "635838945588716414.jpeg", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/29/69/256/256/635838945588716414.jpeg", + "url": "https://media.forgecdn.net/avatars/29/69/635838945588716414.jpeg" + }, + "mainFileId": 8792638, + "latestFiles": [ + { + "id": 3040523, + "gameId": 432, + "modId": 238222, + "isAvailable": true, + "displayName": "jei_1.12.2-4.16.1.301.jar", + "fileName": "jei_1.12.2-4.16.1.301.jar", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "3045e8440ea44071d8b83c4e7b3c190348fdc527", + "algo": 1 + }, + { + "value": "1dee4be93d666e2228039c551e927b35", + "algo": 2 + } + ], + "fileDate": "2020-08-24T01:01:39.123Z", + "fileLength": 653211, + "downloadCount": 29039447, + "downloadUrl": "https://edge.forgecdn.net/files/3040/523/jei_1.12.2-4.16.1.301.jar", + "gameVersions": [ + "1.12.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.12.2", + "gameVersionPadded": "0000000001.0000000012.0000000002", + "gameVersion": "1.12.2", + "gameVersionReleaseDate": "2017-09-18T05:00:00Z", + "gameVersionTypeId": 628 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 3089143260, + "modules": [ + { + "name": "META-INF", + "fingerprint": 2236405288 + }, + { + "name": "mezz", + "fingerprint": 2222830911 + }, + { + "name": "pack.mcmeta", + "fingerprint": 1488642189 + }, + { + "name": "mcmod.info", + "fingerprint": 3528499262 + }, + { + "name": "assets", + "fingerprint": 9943101 + } + ] + }, + { + "id": 3272039, + "gameId": 432, + "modId": 238222, + "isAvailable": true, + "displayName": "jei-1.13.2-5.0.0.31.jar", + "fileName": "jei-1.13.2-5.0.0.31.jar", + "releaseType": 3, + "fileStatus": 4, + "hashes": [ + { + "value": "aa15cdea079db8b91d75e3c68216df80a70545d8", + "algo": 1 + }, + { + "value": "1ee1f4fb4c6e199c02c7d15cbd0d2c8a", + "algo": 2 + } + ], + "fileDate": "2021-04-11T03:49:47.687Z", + "fileLength": 690802, + "downloadCount": 32375, + "downloadUrl": "https://edge.forgecdn.net/files/3272/39/jei-1.13.2-5.0.0.31.jar", + "gameVersions": [ + "1.13.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.13.2", + "gameVersionPadded": "0000000001.0000000013.0000000002", + "gameVersion": "1.13.2", + "gameVersionReleaseDate": "2018-10-22T00:00:00Z", + "gameVersionTypeId": 55023 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 2700304635, + "modules": [ + { + "name": "META-INF", + "fingerprint": 1102858494 + }, + { + "name": "mezz", + "fingerprint": 2811918946 + }, + { + "name": "pack.mcmeta", + "fingerprint": 3652707984 + }, + { + "name": "assets", + "fingerprint": 88833534 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "1.20.1", + "fileId": 9174950, + "filename": "jei-1.20.1-fabric-15.70.0.221.jar", + "releaseType": 2, + "gameVersionTypeId": 75125, + "modLoader": 4 + }, + { + "gameVersion": "1.20.1", + "fileId": 9174949, + "filename": "jei-1.20.1-forge-15.70.0.221.jar", + "releaseType": 2, + "gameVersionTypeId": 75125, + "modLoader": 1 + }, + { + "gameVersion": "26.3", + "fileId": 9174418, + "filename": "jei-26.3-neoforge-31.12.0.66.jar", + "releaseType": 2, + "gameVersionTypeId": 88556, + "modLoader": 6 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2015-11-23T23:00:41.923Z", + "dateModified": "2026-10-14T16:34:48.923Z", + "dateReleased": "2026-10-14T16:12:30.687Z", + "allowModDistribution": true, + "gamePopularityRank": 2, + "isAvailable": true, + "thumbsUpCount": 1, + "featuredProjectTag": 0 + } + ], + "recentlyUpdated": [ + { + "screenshots": [ + { + "id": 1429220, + "modId": 1407981, + "title": "Banner", + "description": "Generated via Minecraft Title Generator plugin on Blockbench (Minecraft assets used under Mojang’s EULA and Brand Guidelines)", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1429/220/310/172/a26b427556f27a70a28432935267a05fabf99caf-png.png", + "url": "https://media.forgecdn.net/attachments/1429/220/a26b427556f27a70a28432935267a05fabf99caf-png.png" + }, + { + "id": 1741632, + "modId": 1407981, + "title": "Focus Recipes", + "description": "All Aspect Focus recipes in order of appearance as of v1.3.1", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1741/632/310/172/focus_recipes-png.png", + "url": "https://media.forgecdn.net/attachments/1741/632/focus_recipes-png.png" + }, + { + "id": 1741633, + "modId": 1407981, + "title": "Aspect: Dragonkin", + "description": "Introduced: v1.0.0", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1741/633/310/172/dragonkin-png.png", + "url": "https://media.forgecdn.net/attachments/1741/633/dragonkin-png.png" + }, + { + "id": 1741634, + "modId": 1407981, + "title": "Aspect: Frostling", + "description": "Introduced: v1.0.0", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1741/634/310/172/frostling-png.png", + "url": "https://media.forgecdn.net/attachments/1741/634/frostling-png.png" + }, + { + "id": 1741635, + "modId": 1407981, + "title": "Aspect: Remnant", + "description": "Introduced: v1.0.0", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1741/635/310/172/remnant-png.png", + "url": "https://media.forgecdn.net/attachments/1741/635/remnant-png.png" + }, + { + "id": 1741636, + "modId": 1407981, + "title": "Aspect: Pebblemite", + "description": "Introduced: v1.0.0", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1741/636/310/172/pebblemite-png.png", + "url": "https://media.forgecdn.net/attachments/1741/636/pebblemite-png.png" + }, + { + "id": 1741637, + "modId": 1407981, + "title": "Aspect: Voidborne", + "description": "Introduced: v1.0.0", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1741/637/310/172/voidborne-png.png", + "url": "https://media.forgecdn.net/attachments/1741/637/voidborne-png.png" + }, + { + "id": 1741638, + "modId": 1407981, + "title": "Aspect: Phoenix", + "description": "Introduced: v1.0.0", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1741/638/310/172/phoenix-png.png", + "url": "https://media.forgecdn.net/attachments/1741/638/phoenix-png.png" + }, + { + "id": 1741639, + "modId": 1407981, + "title": "Aspect: Morphling", + "description": "Introduced: v1.1.0", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/1741/639/310/172/morphling-png.png", + "url": "https://media.forgecdn.net/attachments/1741/639/morphling-png.png" + } + ], + "id": 1407981, + "gameId": 432, + "name": "Aspects: Reclaimed", + "slug": "aspects-reclaimed", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/mc-mods/aspects-reclaimed", + "wikiUrl": null, + "issuesUrl": null, + "sourceUrl": "https://github.com/CyraLX/Aspects-Reclaimed" + }, + "summary": "An Aspects Addon introducing 7 new Aspects inspired by concepts that go beyond the base modification", + "status": 4, + "downloadCount": 4085, + "favoriteCount": 0, + "isFeatured": false, + "primaryCategoryId": 422, + "categories": [ + { + "id": 418, + "gameId": 432, + "name": "Genetics", + "slug": "technology-genetics", + "url": "https://www.curseforge.com/minecraft/mc-mods/technology/technology-genetics", + "iconUrl": "https://media.forgecdn.net/avatars/6/33/635351495921521214.png", + "dateModified": "2014-05-08T17:39:52.153Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 412 + }, + { + "id": 422, + "gameId": 432, + "name": "Adventure and RPG", + "slug": "adventure-rpg", + "url": "https://www.curseforge.com/minecraft/mc-mods/adventure-rpg", + "iconUrl": "https://media.forgecdn.net/avatars/6/37/635351497295252123.png", + "dateModified": "2014-05-08T17:42:09.54Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 6 + }, + { + "id": 419, + "gameId": 432, + "name": "Magic", + "slug": "magic", + "url": "https://www.curseforge.com/minecraft/mc-mods/magic", + "iconUrl": "https://media.forgecdn.net/avatars/6/34/635351496247862494.png", + "dateModified": "2014-05-08T17:40:24.787Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 6 + } + ], + "classId": 6, + "authors": [ + { + "id": 102306723, + "name": "efimity", + "url": "https://www.curseforge.com/members/efimity", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/9bbdb6b5-d44d-4b8f-8694-18b8d09d411f-profile_image-150x150.png" + }, + { + "id": 128818362, + "name": "CyraLX", + "url": "https://www.curseforge.com/members/cyralx", + "avatarUrl": "https://avatars.githubusercontent.com/u/51757300?v=4" + } + ], + "logo": { + "id": 1871743, + "modId": 1407981, + "title": "639173364652395874.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/1871/743/256/256/639173364652395874.png", + "url": "https://media.forgecdn.net/avatars/1871/743/639173364652395874.png" + }, + "mainFileId": 9189621, + "latestFiles": [ + { + "id": 9189621, + "gameId": 432, + "modId": 1407981, + "isAvailable": true, + "displayName": "Aspects: Reclaimed v1.3.3 (1.21.6-1.21.8)", + "fileName": "corrupted-aspects-reclaimed-1.3.3-1.21.6-1.21.8.jar", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "020298ff93fd3c44d07c1ae4f745170ff94095ce", + "algo": 1 + }, + { + "value": "7f181eeaeaf93182c95151669ac2abfd", + "algo": 2 + } + ], + "fileDate": "2026-10-15T10:08:36.36Z", + "fileLength": 553572, + "downloadCount": 0, + "fileSizeOnDisk": 3144174, + "downloadUrl": "https://edge.forgecdn.net/files/9189/621/corrupted-aspects-reclaimed-1.3.3-1.21.6-1.21.8.jar", + "gameVersions": [ + "Client", + "Fabric", + "1.21.8", + "1.21.6", + "1.21.7", + "NeoForge", + "Server" + ], + "sortableGameVersions": [ + { + "gameVersionName": "Client", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-12-08T00:00:00Z", + "gameVersionTypeId": 75208 + }, + { + "gameVersionName": "Fabric", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-09-01T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "1.21.8", + "gameVersionPadded": "0000000001.0000000021.0000000008", + "gameVersion": "1.21.8", + "gameVersionReleaseDate": "2025-07-17T14:01:29.007Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.6", + "gameVersionPadded": "0000000001.0000000021.0000000006", + "gameVersion": "1.21.6", + "gameVersionReleaseDate": "2025-06-17T19:44:59.623Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.7", + "gameVersionPadded": "0000000001.0000000021.0000000007", + "gameVersion": "1.21.7", + "gameVersionReleaseDate": "2025-06-30T14:45:05.54Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "NeoForge", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2023-07-25T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "Server", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-12-08T00:00:00Z", + "gameVersionTypeId": 75208 + } + ], + "dependencies": [ + { + "modId": 1293013, + "relationType": 3 + } + ], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 181298122, + "modules": [ + { + "name": "META-INF", + "fingerprint": 2043300175 + }, + { + "name": "LICENCE", + "fingerprint": 3298097541 + }, + { + "name": "latest_changelog.md", + "fingerprint": 2917570740 + }, + { + "name": "pack.png", + "fingerprint": 307149779 + }, + { + "name": "assets", + "fingerprint": 956668244 + }, + { + "name": "data", + "fingerprint": 2882498621 + }, + { + "name": "pack.mcmeta", + "fingerprint": 2248618469 + }, + { + "name": "overlay_21_10_backport_data", + "fingerprint": 1679366259 + }, + { + "name": "overlay_26_1_backport_data", + "fingerprint": 963792626 + }, + { + "name": "overlay_26_2_backport_data", + "fingerprint": 2239456376 + }, + { + "name": "fabric.mod.json", + "fingerprint": 1987794150 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "1.21.8", + "fileId": 9189621, + "filename": "corrupted-aspects-reclaimed-1.3.3-1.21.6-1.21.8.jar", + "releaseType": 1, + "gameVersionTypeId": 77784, + "modLoader": 4 + }, + { + "gameVersion": "1.21.8", + "fileId": 9189621, + "filename": "corrupted-aspects-reclaimed-1.3.3-1.21.6-1.21.8.jar", + "releaseType": 1, + "gameVersionTypeId": 77784, + "modLoader": 6 + }, + { + "gameVersion": "1.21.6", + "fileId": 9189621, + "filename": "corrupted-aspects-reclaimed-1.3.3-1.21.6-1.21.8.jar", + "releaseType": 1, + "gameVersionTypeId": 77784, + "modLoader": 4 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2026-01-03T07:17:35.253Z", + "dateModified": "2026-10-15T10:12:26.103Z", + "dateReleased": "2026-10-15T10:08:36.36Z", + "allowModDistribution": true, + "gamePopularityRank": 43412, + "isAvailable": true, + "thumbsUpCount": 0, + "socialLinks": [ + { + "type": 2, + "url": "https://discord.gg/WCxY5AzfA4" + } + ], + "featuredProjectTag": 0 + }, + { + "screenshots": [ + { + "id": 2053362, + "modId": 1744632, + "title": "Crystal detail and effects settings", + "description": "The F8 settings screen with Core only selected, beam and animation toggles, and distance-based detail controls.", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/2053/362/310/172/settings-core-draft-26-3-png.png", + "url": "https://media.forgecdn.net/attachments/2053/362/settings-core-draft-26-3-png.png" + }, + { + "id": 2053363, + "modId": 1744632, + "title": "Vanilla crystal detail", + "description": "The crystal with its normal glass detail and beam, captured in Minecraft 26.3.", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/2053/363/310/172/world-vanilla-26-3-png.png", + "url": "https://media.forgecdn.net/attachments/2053/363/world-vanilla-26-3-png.png" + }, + { + "id": 2053364, + "modId": 1744632, + "title": "Core-only crystal detail", + "description": "Core-only rendering keeps the crystal visible while removing its glass shells. The beam remains enabled.", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/2053/364/310/172/world-core-only-26-3-png.png", + "url": "https://media.forgecdn.net/attachments/2053/364/world-core-only-26-3-png.png" + }, + { + "id": 2053365, + "modId": 1744632, + "title": "Core-only detail with beams off", + "description": "The optional beam toggle removes the beam visual while the crystal core remains visible. Genuine Minecraft 26.3 capture.", + "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/2053/365/310/172/world-core-no-beam-26-3-png.png", + "url": "https://media.forgecdn.net/attachments/2053/365/world-core-no-beam-26-3-png.png" + } + ], + "id": 1744632, + "gameId": 432, + "name": "PixelCrystalOptimizer", + "slug": "pixelcrystaloptimizer", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/mc-mods/pixelcrystaloptimizer", + "wikiUrl": null, + "issuesUrl": null, + "sourceUrl": null + }, + "summary": "Optional end-crystal rendering simplification with distance-based detail, beam controls, and an F8 settings screen.", + "status": 4, + "downloadCount": 93, + "favoriteCount": 0, + "isFeatured": false, + "primaryCategoryId": 6814, + "categories": [ + { + "id": 6814, + "gameId": 432, + "name": "Performance", + "slug": "performance", + "url": "https://www.curseforge.com/minecraft/mc-mods/performance", + "iconUrl": "https://media.forgecdn.net/avatars/933/987/638409849610531091.png", + "dateModified": "2024-01-16T06:56:01.057Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 6 + } + ], + "classId": 6, + "authors": [ + { + "id": 131334088, + "name": "dreamiiing", + "url": "https://www.curseforge.com/members/dreamiiing", + "avatarUrl": "https://lh3.googleusercontent.com/a/ACg8ocKYE0cKZUJ74IanGuEiFvP_IRSKYi2Z3sH17OUpsI9ntAzvQg=s96-c" + } + ], + "logo": { + "id": 2117976, + "modId": 1744632, + "title": "639275783763157560.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/2117/976/256/256/639275783763157560.png", + "url": "https://media.forgecdn.net/avatars/2117/976/639275783763157560.png" + }, + "mainFileId": 9189620, + "latestFiles": [ + { + "id": 9172784, + "gameId": 432, + "modId": 1744632, + "isAvailable": true, + "displayName": "PixelCrystalOptimizer 1.0.0 Beta - Fabric 26.3", + "fileName": "pixel-crystal-optimizer-fabric-1.0.0+26.3.jar", + "releaseType": 2, + "fileStatus": 4, + "hashes": [ + { + "value": "93a27a0c44c51b57007197f3a81d80313f88c034", + "algo": 1 + }, + { + "value": "4695be64ca23d00e6fca7af8a312889c", + "algo": 2 + } + ], + "fileDate": "2026-10-14T12:51:58.633Z", + "fileLength": 17710, + "downloadCount": 2, + "fileSizeOnDisk": 27662, + "downloadUrl": null, + "gameVersions": [ + "Client", + "Fabric", + "26.3" + ], + "sortableGameVersions": [ + { + "gameVersionName": "Client", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-12-08T00:00:00Z", + "gameVersionTypeId": 75208 + }, + { + "gameVersionName": "Fabric", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-09-01T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "26.3", + "gameVersionPadded": "0000000026.0000000003", + "gameVersion": "26.3", + "gameVersionReleaseDate": "2026-09-15T15:46:48.187Z", + "gameVersionTypeId": 88556 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 4236824380, + "modules": [ + { + "name": "assets", + "fingerprint": 178564586 + }, + { + "name": "dev", + "fingerprint": 1752371326 + }, + { + "name": "fabric.mod.json", + "fingerprint": 1401522073 + }, + { + "name": "pixelcrystaloptimizer.mixins.json", + "fingerprint": 582896974 + }, + { + "name": "LICENSE", + "fingerprint": 1641829060 + } + ] + }, + { + "id": 9173018, + "gameId": 432, + "modId": 1744632, + "isAvailable": true, + "displayName": "PixelCrystalOptimizer 1.0.0 Beta - NeoForge 26.3", + "fileName": "pixel-crystal-optimizer-neoforge-1.0.0+26.3.jar", + "releaseType": 2, + "fileStatus": 4, + "hashes": [ + { + "value": "1ce2f248c441cf8d71acb0321daf8a4887e94591", + "algo": 1 + }, + { + "value": "d7d772f11e530099a60af2dce6f195ce", + "algo": 2 + } + ], + "fileDate": "2026-10-14T13:12:05.917Z", + "fileLength": 18251, + "downloadCount": 10, + "fileSizeOnDisk": 28175, + "downloadUrl": null, + "gameVersions": [ + "Client", + "NeoForge", + "26.3" + ], + "sortableGameVersions": [ + { + "gameVersionName": "Client", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-12-08T00:00:00Z", + "gameVersionTypeId": 75208 + }, + { + "gameVersionName": "NeoForge", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2023-07-25T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "26.3", + "gameVersionPadded": "0000000026.0000000003", + "gameVersion": "26.3", + "gameVersionReleaseDate": "2026-09-15T15:46:48.187Z", + "gameVersionTypeId": 88556 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 4060524134, + "modules": [ + { + "name": "META-INF", + "fingerprint": 959995841 + }, + { + "name": "assets", + "fingerprint": 178564586 + }, + { + "name": "dev", + "fingerprint": 948059117 + }, + { + "name": "pixelcrystaloptimizer.mixins.json", + "fingerprint": 582896974 + }, + { + "name": "LICENSE", + "fingerprint": 1641829060 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "1.16.5", + "fileId": 9189620, + "filename": "pixelcrystaloptimizer-1.0.1+1.16.5-forge.jar", + "releaseType": 2, + "gameVersionTypeId": 70886, + "modLoader": 1 + }, + { + "gameVersion": "1.15.2", + "fileId": 9189605, + "filename": "pixelcrystaloptimizer-1.0.1+1.15.2-forge.jar", + "releaseType": 2, + "gameVersionTypeId": 68722, + "modLoader": 1 + }, + { + "gameVersion": "1.14.4", + "fileId": 9189567, + "filename": "pixelcrystaloptimizer-1.0.1+1.14.4-forge.jar", + "releaseType": 2, + "gameVersionTypeId": 64806, + "modLoader": 1 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2026-10-14T13:54:53.283Z", + "dateModified": "2026-10-15T10:12:25.763Z", + "dateReleased": "2026-10-15T10:08:24.07Z", + "allowModDistribution": false, + "gamePopularityRank": 999999, + "isAvailable": true, + "thumbsUpCount": 0, + "featuredProjectTag": 0 + } + ] + } +} diff --git a/tests/Unit/Client/Fixtures/getMod.json b/tests/Unit/Client/Fixtures/getMod.json new file mode 100644 index 0000000..0fced06 --- /dev/null +++ b/tests/Unit/Client/Fixtures/getMod.json @@ -0,0 +1,287 @@ +{ + "data": { + "screenshots": [], + "id": 420561, + "gameId": 432, + "name": "Mclogs - mclo.gs", + "slug": "mclo-gs", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/mc-mods/mclo-gs", + "wikiUrl": "", + "issuesUrl": "https://github.com/aternosorg/mclogs-integration/issues", + "sourceUrl": "https://github.com/aternosorg/mclogs-integration" + }, + "summary": "Share your Minecraft server log directly from your server with one simple command. ", + "status": 4, + "downloadCount": 494489, + "favoriteCount": 15, + "isFeatured": false, + "primaryCategoryId": 435, + "categories": [ + { + "id": 435, + "gameId": 432, + "name": "Server Utility", + "slug": "server-utility", + "url": "https://www.curseforge.com/minecraft/mc-mods/server-utility", + "iconUrl": "https://media.forgecdn.net/avatars/6/48/635351498950580836.png", + "dateModified": "2014-05-08T17:44:55.057Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 6 + } + ], + "classId": 6, + "authors": [ + { + "id": 15007584, + "name": "Aternos", + "url": "https://www.curseforge.com/members/aternos", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/aac8fc81-daa4-4784-a43b-1d6ab1d4c6fb-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 2, + "downloadsThreshold": 500000 + } + }, + { + "id": 21438892, + "name": "JulianVennen", + "url": "https://www.curseforge.com/members/julianvennen", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/244694d8-83b9-408c-924a-38d0f4116352-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 0, + "downloadsThreshold": 0 + } + } + ], + "logo": { + "id": 1659426, + "modId": 420561, + "title": "639057208443929348.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/1659/426/256/256/639057208443929348.png", + "url": "https://media.forgecdn.net/avatars/1659/426/639057208443929348.png" + }, + "mainFileId": 8946029, + "latestFiles": [ + { + "id": 3553911, + "gameId": 432, + "modId": 420561, + "isAvailable": true, + "displayName": "mclo.gs v1.3.0 for Forge 1.16.5", + "fileName": "mclogs-forge-1.3.0-for-1.16.5.jar", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "12513f69eee677f5763026621734b97af4841233", + "algo": 1 + }, + { + "value": "f74210999c2e175480ac39521e95afdf", + "algo": 2 + } + ], + "fileDate": "2021-12-07T16:37:02.75Z", + "fileLength": 31346, + "downloadCount": 200, + "downloadUrl": "https://edge.forgecdn.net/files/3553/911/mclogs-forge-1.3.0-for-1.16.5.jar", + "gameVersions": [ + "1.16.3", + "1.16.1", + "1.16", + "1.16.4", + "1.16.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.16.3", + "gameVersionPadded": "0000000001.0000000016.0000000003", + "gameVersion": "1.16.3", + "gameVersionReleaseDate": "2020-09-10T14:44:20.443Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16.1", + "gameVersionPadded": "0000000001.0000000016.0000000001", + "gameVersion": "1.16.1", + "gameVersionReleaseDate": "2020-06-24T12:41:11.823Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16", + "gameVersionPadded": "0000000001.0000000016", + "gameVersion": "1.16", + "gameVersionReleaseDate": "2020-06-23T13:41:08.75Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16.4", + "gameVersionPadded": "0000000001.0000000016.0000000004", + "gameVersion": "1.16.4", + "gameVersionReleaseDate": "2020-11-02T18:40:51.49Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16.2", + "gameVersionPadded": "0000000001.0000000016.0000000002", + "gameVersion": "1.16.2", + "gameVersionReleaseDate": "2020-08-11T16:42:21.863Z", + "gameVersionTypeId": 70886 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 2703393364, + "modules": [] + }, + { + "id": 6235017, + "gameId": 432, + "modId": 420561, + "isAvailable": true, + "displayName": "mclogs-fabric-1.21.4-3.0.0-dev.jar", + "fileName": "mclogs-fabric-1.21.4-3.0.0-dev.jar", + "releaseType": 3, + "fileStatus": 4, + "hashes": [ + { + "value": "13632ac8a83563aa3836139781d62134d376624b", + "algo": 1 + }, + { + "value": "230ce06a7f88484a6c615869bcc06126", + "algo": 2 + } + ], + "fileDate": "2025-02-25T15:59:14.99Z", + "fileLength": 64225, + "downloadCount": 8, + "fileSizeOnDisk": 144589, + "downloadUrl": "https://edge.forgecdn.net/files/6235/17/mclogs-fabric-1.21.4-3.0.0-dev.jar", + "gameVersions": [ + "1.21", + "Fabric", + "1.21.4", + "1.21.3", + "1.21.1", + "1.21.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.21", + "gameVersionPadded": "0000000001.0000000021", + "gameVersion": "1.21", + "gameVersionReleaseDate": "2024-06-14T00:00:00Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "Fabric", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-09-01T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "1.21.4", + "gameVersionPadded": "0000000001.0000000021.0000000004", + "gameVersion": "1.21.4", + "gameVersionReleaseDate": "2024-12-03T16:26:15.35Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.3", + "gameVersionPadded": "0000000001.0000000021.0000000003", + "gameVersion": "1.21.3", + "gameVersionReleaseDate": "2024-10-23T13:16:45.71Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.1", + "gameVersionPadded": "0000000001.0000000021.0000000001", + "gameVersion": "1.21.1", + "gameVersionReleaseDate": "2024-08-08T15:17:53.787Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.2", + "gameVersionPadded": "0000000001.0000000021.0000000002", + "gameVersion": "1.21.2", + "gameVersionReleaseDate": "2024-10-22T00:00:00Z", + "gameVersionTypeId": 77784 + } + ], + "dependencies": [ + { + "modId": 306612, + "relationType": 3 + } + ], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 3226610985, + "modules": [ + { + "name": "META-INF", + "fingerprint": 3437539353 + }, + { + "name": "gs", + "fingerprint": 2144871004 + }, + { + "name": "fabric.mod.json", + "fingerprint": 702809486 + }, + { + "name": "assets", + "fingerprint": 2196086191 + }, + { + "name": "pack.mcmeta", + "fingerprint": 845577715 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "26.1", + "fileId": 8946029, + "filename": "mclogs-neoforge-26.1-3.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 83806, + "modLoader": 6 + }, + { + "gameVersion": "26.1.1", + "fileId": 8946029, + "filename": "mclogs-neoforge-26.1-3.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 83806, + "modLoader": 6 + }, + { + "gameVersion": "26.1.2", + "fileId": 8946029, + "filename": "mclogs-neoforge-26.1-3.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 83806, + "modLoader": 6 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2020-11-17T21:36:28.057Z", + "dateModified": "2026-09-22T10:03:46.67Z", + "dateReleased": "2026-09-22T09:44:53.913Z", + "allowModDistribution": true, + "gamePopularityRank": 13195, + "isAvailable": true, + "hasCommentsEnabled": true, + "licenseType": "MIT License", + "thumbsUpCount": 0, + "featuredProjectTag": 0 + } +} diff --git a/tests/Unit/Client/Fixtures/getModDescription.json b/tests/Unit/Client/Fixtures/getModDescription.json new file mode 100644 index 0000000..5bfcfd3 --- /dev/null +++ b/tests/Unit/Client/Fixtures/getModDescription.json @@ -0,0 +1,3 @@ +{ + "data": "
\"Logo\"

Server Mod

Bukkit Plugin
\n

About mclo.gs

\n

mclo.gs allows you to quickly share and analyze logs for Minecraft servers and clients. It highlights different log levels, removes sensitive information like IP-Addresses and detects common problems as well as version information.

\n

Features

\n\n

Commands

\n

The Plugin/Mod contains the following commands:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CommandArgumentsDescriptionPermission LevelPermission Node
mclogsShare the current server log2mclogs
mclogs listList server logs, crash- and network protocol error reports2mclogs.list
mclogs share<file-name>Share a specific log, crash- or network protocol error report2mclogs.share
mclogs delete<log-id\\>Delete a log that was shared from the server2mclogs.delete
\n

For special cases, the following commands are available:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ScenarioCommandBehavior
Mod installed client-side/mclogscHandle client logs
Plugin installed on a Velocity proxy/mclogsp and /mclogsvHandle proxy logs
Plugin installed on a BungeeCord proxy/mclogsp and /mclogsbHandle proxy logs
\n

Permissions

\n

Commands are not available to players by default. You can give players access to the commands by giving them the required permissions. Plugin servers permissions use permission nodes for fine-grained access control. The mclogs permission node is required for all other commands as well.

\n

Modded servers use the Vanilla permission level system instead.

\n

Configuration

\n

If you use a self-hosted instance of mclo.gs or want to use an alternative front-end, you can configure the plugin/mod to use your instance. The config file is located in plugins/mclogs/config.toml for plugin servers and config/mclogs.toml for modded servers.

\n

Default configuration

\n
# Base URL for the API used to upload logs\napiBaseUrl = \"https://api.mclo.gs\"
\n

Requirements

\n

This mod requires Java 11 or higher to run, even on Minecraft versions that run on Java 8.

" +} diff --git a/tests/Unit/Client/Fixtures/getMods.json b/tests/Unit/Client/Fixtures/getMods.json new file mode 100644 index 0000000..c4be431 --- /dev/null +++ b/tests/Unit/Client/Fixtures/getMods.json @@ -0,0 +1,826 @@ +{ + "data": [ + { + "screenshots": [], + "id": 420561, + "gameId": 432, + "name": "Mclogs - mclo.gs", + "slug": "mclo-gs", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/mc-mods/mclo-gs", + "wikiUrl": "", + "issuesUrl": "https://github.com/aternosorg/mclogs-integration/issues", + "sourceUrl": "https://github.com/aternosorg/mclogs-integration" + }, + "summary": "Share your Minecraft server log directly from your server with one simple command. ", + "status": 4, + "downloadCount": 494489, + "favoriteCount": 15, + "isFeatured": false, + "primaryCategoryId": 435, + "categories": [ + { + "id": 435, + "gameId": 432, + "name": "Server Utility", + "slug": "server-utility", + "url": "https://www.curseforge.com/minecraft/mc-mods/server-utility", + "iconUrl": "https://media.forgecdn.net/avatars/6/48/635351498950580836.png", + "dateModified": "2014-05-08T17:44:55.057Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 6 + } + ], + "classId": 6, + "authors": [ + { + "id": 15007584, + "name": "Aternos", + "url": "https://www.curseforge.com/members/aternos", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/aac8fc81-daa4-4784-a43b-1d6ab1d4c6fb-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 2, + "downloadsThreshold": 500000 + } + }, + { + "id": 21438892, + "name": "JulianVennen", + "url": "https://www.curseforge.com/members/julianvennen", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/244694d8-83b9-408c-924a-38d0f4116352-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 0, + "downloadsThreshold": 0 + } + } + ], + "logo": { + "id": 1659426, + "modId": 420561, + "title": "639057208443929348.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/1659/426/256/256/639057208443929348.png", + "url": "https://media.forgecdn.net/avatars/1659/426/639057208443929348.png" + }, + "mainFileId": 8946029, + "latestFiles": [ + { + "id": 3553911, + "gameId": 432, + "modId": 420561, + "isAvailable": true, + "displayName": "mclo.gs v1.3.0 for Forge 1.16.5", + "fileName": "mclogs-forge-1.3.0-for-1.16.5.jar", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "12513f69eee677f5763026621734b97af4841233", + "algo": 1 + }, + { + "value": "f74210999c2e175480ac39521e95afdf", + "algo": 2 + } + ], + "fileDate": "2021-12-07T16:37:02.75Z", + "fileLength": 31346, + "downloadCount": 200, + "downloadUrl": "https://edge.forgecdn.net/files/3553/911/mclogs-forge-1.3.0-for-1.16.5.jar", + "gameVersions": [ + "1.16.3", + "1.16.1", + "1.16", + "1.16.4", + "1.16.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.16.3", + "gameVersionPadded": "0000000001.0000000016.0000000003", + "gameVersion": "1.16.3", + "gameVersionReleaseDate": "2020-09-10T14:44:20.443Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16.1", + "gameVersionPadded": "0000000001.0000000016.0000000001", + "gameVersion": "1.16.1", + "gameVersionReleaseDate": "2020-06-24T12:41:11.823Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16", + "gameVersionPadded": "0000000001.0000000016", + "gameVersion": "1.16", + "gameVersionReleaseDate": "2020-06-23T13:41:08.75Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16.4", + "gameVersionPadded": "0000000001.0000000016.0000000004", + "gameVersion": "1.16.4", + "gameVersionReleaseDate": "2020-11-02T18:40:51.49Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16.2", + "gameVersionPadded": "0000000001.0000000016.0000000002", + "gameVersion": "1.16.2", + "gameVersionReleaseDate": "2020-08-11T16:42:21.863Z", + "gameVersionTypeId": 70886 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 2703393364, + "modules": [] + }, + { + "id": 6235017, + "gameId": 432, + "modId": 420561, + "isAvailable": true, + "displayName": "mclogs-fabric-1.21.4-3.0.0-dev.jar", + "fileName": "mclogs-fabric-1.21.4-3.0.0-dev.jar", + "releaseType": 3, + "fileStatus": 4, + "hashes": [ + { + "value": "13632ac8a83563aa3836139781d62134d376624b", + "algo": 1 + }, + { + "value": "230ce06a7f88484a6c615869bcc06126", + "algo": 2 + } + ], + "fileDate": "2025-02-25T15:59:14.99Z", + "fileLength": 64225, + "downloadCount": 8, + "fileSizeOnDisk": 144589, + "downloadUrl": "https://edge.forgecdn.net/files/6235/17/mclogs-fabric-1.21.4-3.0.0-dev.jar", + "gameVersions": [ + "1.21", + "Fabric", + "1.21.4", + "1.21.3", + "1.21.1", + "1.21.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.21", + "gameVersionPadded": "0000000001.0000000021", + "gameVersion": "1.21", + "gameVersionReleaseDate": "2024-06-14T00:00:00Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "Fabric", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-09-01T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "1.21.4", + "gameVersionPadded": "0000000001.0000000021.0000000004", + "gameVersion": "1.21.4", + "gameVersionReleaseDate": "2024-12-03T16:26:15.35Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.3", + "gameVersionPadded": "0000000001.0000000021.0000000003", + "gameVersion": "1.21.3", + "gameVersionReleaseDate": "2024-10-23T13:16:45.71Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.1", + "gameVersionPadded": "0000000001.0000000021.0000000001", + "gameVersion": "1.21.1", + "gameVersionReleaseDate": "2024-08-08T15:17:53.787Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.2", + "gameVersionPadded": "0000000001.0000000021.0000000002", + "gameVersion": "1.21.2", + "gameVersionReleaseDate": "2024-10-22T00:00:00Z", + "gameVersionTypeId": 77784 + } + ], + "dependencies": [ + { + "modId": 306612, + "relationType": 3 + } + ], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 3226610985, + "modules": [ + { + "name": "META-INF", + "fingerprint": 3437539353 + }, + { + "name": "gs", + "fingerprint": 2144871004 + }, + { + "name": "fabric.mod.json", + "fingerprint": 702809486 + }, + { + "name": "assets", + "fingerprint": 2196086191 + }, + { + "name": "pack.mcmeta", + "fingerprint": 845577715 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "26.1", + "fileId": 8946029, + "filename": "mclogs-neoforge-26.1-3.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 83806, + "modLoader": 6 + }, + { + "gameVersion": "26.1.1", + "fileId": 8946029, + "filename": "mclogs-neoforge-26.1-3.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 83806, + "modLoader": 6 + }, + { + "gameVersion": "26.1.2", + "fileId": 8946029, + "filename": "mclogs-neoforge-26.1-3.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 83806, + "modLoader": 6 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2020-11-17T21:36:28.057Z", + "dateModified": "2026-09-22T10:03:46.67Z", + "dateReleased": "2026-09-22T09:44:53.913Z", + "allowModDistribution": true, + "gamePopularityRank": 13195, + "isAvailable": true, + "hasCommentsEnabled": true, + "licenseType": "MIT License", + "thumbsUpCount": 0, + "featuredProjectTag": 0 + }, + { + "screenshots": [], + "id": 278568, + "gameId": 432, + "name": "Mclogs - mclo.gs", + "slug": "mclogs", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/bukkit-plugins/mclogs", + "wikiUrl": "", + "issuesUrl": "https://github.com/aternosorg/mclogs-integration/issues", + "sourceUrl": "https://github.com/aternosorg/mclogs-integration" + }, + "summary": "Share your Minecraft server log directly from your server with one simple command. ", + "status": 4, + "downloadCount": 7632, + "favoriteCount": 3, + "isFeatured": false, + "primaryCategoryId": 115, + "categories": [ + { + "id": 117, + "gameId": 432, + "name": "Chat Related", + "slug": "chat-related", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/chat-related", + "iconUrl": "https://media.forgecdn.net/avatars/65/450/636162917920915559.png", + "dateModified": "2016-12-02T22:09:52.09Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + }, + { + "id": 115, + "gameId": 432, + "name": "Admin Tools", + "slug": "admin-tools", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/admin-tools", + "iconUrl": "https://media.forgecdn.net/avatars/65/448/636162917918103026.png", + "dateModified": "2016-12-02T22:09:51.92Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + }, + { + "id": 127, + "gameId": 432, + "name": "General", + "slug": "general", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/general", + "iconUrl": "https://media.forgecdn.net/avatars/65/456/636162917924196887.png", + "dateModified": "2016-12-02T22:09:52.42Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + }, + { + "id": 128, + "gameId": 432, + "name": "Informational", + "slug": "informational", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/informational", + "iconUrl": "https://media.forgecdn.net/avatars/65/457/636162917924665620.png", + "dateModified": "2016-12-02T22:09:52.467Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + }, + { + "id": 133, + "gameId": 432, + "name": "Miscellaneous", + "slug": "miscellaneous", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/miscellaneous", + "iconUrl": "https://media.forgecdn.net/avatars/65/462/636162917926853172.png", + "dateModified": "2016-12-02T22:09:52.7Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + } + ], + "classId": 5, + "authors": [ + { + "id": 15007584, + "name": "Aternos", + "url": "https://www.curseforge.com/members/aternos", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/aac8fc81-daa4-4784-a43b-1d6ab1d4c6fb-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 2, + "downloadsThreshold": 500000 + } + }, + { + "id": 21438892, + "name": "JulianVennen", + "url": "https://www.curseforge.com/members/julianvennen", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/244694d8-83b9-408c-924a-38d0f4116352-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 0, + "downloadsThreshold": 0 + } + } + ], + "logo": { + "id": 1659422, + "modId": 278568, + "title": "639057206113140311.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/1659/422/256/256/639057206113140311.png", + "url": "https://media.forgecdn.net/avatars/1659/422/639057206113140311.png" + }, + "mainFileId": 8641361, + "latestFiles": [ + { + "id": 8641361, + "gameId": 432, + "modId": 278568, + "isAvailable": true, + "displayName": "mclogs-bukkit-26.1-3.3.2.jar", + "fileName": "mclogs-bukkit-26.1-3.3.2.jar", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "a75daf6b5bb4d45029292f447362b5cdb0c49bbd", + "algo": 1 + }, + { + "value": "f5e9ceb5eff0e46698e94aa36f64c116", + "algo": 2 + } + ], + "fileDate": "2026-08-13T16:53:55.04Z", + "fileLength": 1586301, + "downloadCount": 5, + "fileSizeOnDisk": 3697173, + "downloadUrl": "https://edge.forgecdn.net/files/8641/361/mclogs-bukkit-26.1-3.3.2.jar", + "gameVersions": [ + "26.1.1", + "26.1", + "26.1.2", + "26.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "26.1.1", + "gameVersionPadded": "0000000026.0000000001.0000000001", + "gameVersion": "26.1.1", + "gameVersionReleaseDate": "2026-04-09T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "26.1", + "gameVersionPadded": "0000000026.0000000001", + "gameVersion": "26.1", + "gameVersionReleaseDate": "2026-04-09T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "26.1.2", + "gameVersionPadded": "0000000026.0000000001.0000000002", + "gameVersion": "26.1.2", + "gameVersionReleaseDate": "2026-04-09T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "26.2", + "gameVersionPadded": "0000000026.0000000002", + "gameVersion": "26.2", + "gameVersionReleaseDate": "2026-06-16T00:00:00Z", + "gameVersionTypeId": 1 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 528184115, + "modules": [ + { + "name": "META-INF", + "fingerprint": 4058928240 + }, + { + "name": "gs", + "fingerprint": 1327173963 + }, + { + "name": "plugin.yml", + "fingerprint": 4207311037 + }, + { + "name": "org", + "fingerprint": 3750992258 + }, + { + "name": "com", + "fingerprint": 4021501202 + }, + { + "name": "net", + "fingerprint": 3310300148 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "26.1.1", + "fileId": 8641361, + "filename": "mclogs-bukkit-26.1-3.3.2.jar", + "releaseType": 1, + "gameVersionTypeId": 1 + }, + { + "gameVersion": "26.1", + "fileId": 8641361, + "filename": "mclogs-bukkit-26.1-3.3.2.jar", + "releaseType": 1, + "gameVersionTypeId": 1 + }, + { + "gameVersion": "26.1.2", + "fileId": 8641361, + "filename": "mclogs-bukkit-26.1-3.3.2.jar", + "releaseType": 1, + "gameVersionTypeId": 1 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2017-09-22T20:06:09.267Z", + "dateModified": "2026-08-13T17:03:39.103Z", + "dateReleased": "2026-08-13T16:53:55.04Z", + "allowModDistribution": true, + "gamePopularityRank": 58020, + "isAvailable": true, + "hasCommentsEnabled": true, + "licenseType": "MIT License", + "thumbsUpCount": 0, + "featuredProjectTag": 0 + }, + { + "screenshots": [], + "id": 715033, + "gameId": 432, + "name": "motd.gg", + "slug": "motd-gg", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/bukkit-plugins/motd-gg", + "wikiUrl": "", + "issuesUrl": "https://github.com/aternosorg/motdgg-bukkit/issues", + "sourceUrl": "https://github.com/aternosorg/motdgg-bukkit" + }, + "summary": "Use MOTDs created on motd.gg", + "status": 4, + "downloadCount": 1262, + "favoriteCount": 0, + "isFeatured": false, + "primaryCategoryId": 115, + "categories": [ + { + "id": 128, + "gameId": 432, + "name": "Informational", + "slug": "informational", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/informational", + "iconUrl": "https://media.forgecdn.net/avatars/65/457/636162917924665620.png", + "dateModified": "2016-12-02T22:09:52.467Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + }, + { + "id": 115, + "gameId": 432, + "name": "Admin Tools", + "slug": "admin-tools", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/admin-tools", + "iconUrl": "https://media.forgecdn.net/avatars/65/448/636162917918103026.png", + "dateModified": "2016-12-02T22:09:51.92Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + } + ], + "classId": 5, + "authors": [ + { + "id": 15007584, + "name": "Aternos", + "url": "https://www.curseforge.com/members/aternos", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/aac8fc81-daa4-4784-a43b-1d6ab1d4c6fb-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 2, + "downloadsThreshold": 500000 + } + }, + { + "id": 21438892, + "name": "JulianVennen", + "url": "https://www.curseforge.com/members/julianvennen", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/244694d8-83b9-408c-924a-38d0f4116352-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 0, + "downloadsThreshold": 0 + } + }, + { + "id": 104003839, + "name": "Vollzeitidiot", + "url": "https://www.curseforge.com/members/vollzeitidiot", + "avatarUrl": "https://static-cdn.jtvnw.net/user-default-pictures-uv/dbdc9198-def8-11e9-8681-784f43822e80-profile_image-150x150.png" + } + ], + "logo": { + "id": 652029, + "modId": 715033, + "title": "638053297435572942.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/652/29/256/256/638053297435572942.png", + "url": "https://media.forgecdn.net/avatars/652/29/638053297435572942.png" + }, + "mainFileId": 4472833, + "latestFiles": [ + { + "id": 4472833, + "gameId": 432, + "modId": 715033, + "isAvailable": true, + "displayName": "v1.3.4", + "fileName": "motdgg-bukkit-1.3.4.jar", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "4f144728c2788c32c15053159df2fbfca895ba35", + "algo": 1 + }, + { + "value": "77f343f6b200ed802f44995fe8190ec2", + "algo": 2 + } + ], + "fileDate": "2023-04-03T11:07:33.617Z", + "fileLength": 759791, + "downloadCount": 468, + "downloadUrl": "https://edge.forgecdn.net/files/4472/833/motdgg-bukkit-1.3.4.jar", + "gameVersions": [ + "1.9", + "1.16", + "1.19.3", + "1.18.1", + "1.19.2", + "1.17", + "1.14", + "1.18", + "1.11", + "1.12", + "1.10", + "1.15", + "1.13", + "1.19", + "1.18.2", + "1.19.1" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.9", + "gameVersionPadded": "0000000001.0000000009", + "gameVersion": "1.9", + "gameVersionReleaseDate": "2016-02-29T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.16", + "gameVersionPadded": "0000000001.0000000016", + "gameVersion": "1.16", + "gameVersionReleaseDate": "2020-06-23T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.19.3", + "gameVersionPadded": "0000000001.0000000019.0000000003", + "gameVersion": "1.19.3", + "gameVersionReleaseDate": "2022-10-02T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.18.1", + "gameVersionPadded": "0000000001.0000000018.0000000001", + "gameVersion": "1.18.1", + "gameVersionReleaseDate": "2021-12-26T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.19.2", + "gameVersionPadded": "0000000001.0000000019.0000000002", + "gameVersion": "1.19.2", + "gameVersionReleaseDate": "2022-10-01T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.17", + "gameVersionPadded": "0000000001.0000000017", + "gameVersion": "1.17", + "gameVersionReleaseDate": "2021-06-08T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.14", + "gameVersionPadded": "0000000001.0000000014", + "gameVersion": "1.14", + "gameVersionReleaseDate": "2019-04-23T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.18", + "gameVersionPadded": "0000000001.0000000018", + "gameVersion": "1.18", + "gameVersionReleaseDate": "2021-12-05T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.11", + "gameVersionPadded": "0000000001.0000000011", + "gameVersion": "1.11", + "gameVersionReleaseDate": "2016-11-14T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.12", + "gameVersionPadded": "0000000001.0000000012", + "gameVersion": "1.12", + "gameVersionReleaseDate": "2017-06-01T05:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.10", + "gameVersionPadded": "0000000001.0000000010", + "gameVersion": "1.10", + "gameVersionReleaseDate": "2016-06-08T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.15", + "gameVersionPadded": "0000000001.0000000015", + "gameVersion": "1.15", + "gameVersionReleaseDate": "2019-12-11T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.13", + "gameVersionPadded": "0000000001.0000000013", + "gameVersion": "1.13", + "gameVersionReleaseDate": "2018-08-21T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.19", + "gameVersionPadded": "0000000001.0000000019", + "gameVersion": "1.19", + "gameVersionReleaseDate": "2022-06-08T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.18.2", + "gameVersionPadded": "0000000001.0000000018.0000000002", + "gameVersion": "1.18.2", + "gameVersionReleaseDate": "2022-03-02T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "1.19.1", + "gameVersionPadded": "0000000001.0000000019.0000000001", + "gameVersion": "1.19.1", + "gameVersionReleaseDate": "2022-06-28T00:00:00Z", + "gameVersionTypeId": 1 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 892639431, + "modules": [ + { + "name": "META-INF", + "fingerprint": 1583716774 + }, + { + "name": "gg", + "fingerprint": 1145218568 + }, + { + "name": "plugin.yml", + "fingerprint": 3421617992 + }, + { + "name": "net", + "fingerprint": 2476619768 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "1.9", + "fileId": 4472833, + "filename": "motdgg-bukkit-1.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 1 + }, + { + "gameVersion": "1.16", + "fileId": 4472833, + "filename": "motdgg-bukkit-1.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 1 + }, + { + "gameVersion": "1.19.3", + "fileId": 4472833, + "filename": "motdgg-bukkit-1.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 1 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2022-11-30T07:29:32.997Z", + "dateModified": "2023-08-17T14:17:16.577Z", + "dateReleased": "2022-12-02T15:58:54.463Z", + "allowModDistribution": true, + "gamePopularityRank": 46693, + "isAvailable": true, + "hasCommentsEnabled": true, + "licenseType": "MIT License", + "thumbsUpCount": 0, + "featuredProjectTag": 0 + } + ] +} diff --git a/tests/Unit/Client/Fixtures/searchMods.json b/tests/Unit/Client/Fixtures/searchMods.json new file mode 100644 index 0000000..86e5fe6 --- /dev/null +++ b/tests/Unit/Client/Fixtures/searchMods.json @@ -0,0 +1,535 @@ +{ + "data": [ + { + "screenshots": [], + "id": 420561, + "gameId": 432, + "name": "Mclogs - mclo.gs", + "slug": "mclo-gs", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/mc-mods/mclo-gs", + "wikiUrl": "", + "issuesUrl": "https://github.com/aternosorg/mclogs-integration/issues", + "sourceUrl": "https://github.com/aternosorg/mclogs-integration" + }, + "summary": "Share your Minecraft server log directly from your server with one simple command. ", + "status": 4, + "downloadCount": 494489, + "favoriteCount": 15, + "isFeatured": false, + "primaryCategoryId": 435, + "categories": [ + { + "id": 435, + "gameId": 432, + "name": "Server Utility", + "slug": "server-utility", + "url": "https://www.curseforge.com/minecraft/mc-mods/server-utility", + "iconUrl": "https://media.forgecdn.net/avatars/6/48/635351498950580836.png", + "dateModified": "2014-05-08T17:44:55.057Z", + "isClass": false, + "classId": 6, + "parentCategoryId": 6 + } + ], + "classId": 6, + "authors": [ + { + "id": 15007584, + "name": "Aternos", + "url": "https://www.curseforge.com/members/aternos", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/aac8fc81-daa4-4784-a43b-1d6ab1d4c6fb-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 2, + "downloadsThreshold": 500000 + } + }, + { + "id": 21438892, + "name": "JulianVennen", + "url": "https://www.curseforge.com/members/julianvennen", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/244694d8-83b9-408c-924a-38d0f4116352-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 0, + "downloadsThreshold": 0 + } + } + ], + "logo": { + "id": 1659426, + "modId": 420561, + "title": "639057208443929348.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/1659/426/256/256/639057208443929348.png", + "url": "https://media.forgecdn.net/avatars/1659/426/639057208443929348.png" + }, + "mainFileId": 8946029, + "latestFiles": [ + { + "id": 3553911, + "gameId": 432, + "modId": 420561, + "isAvailable": true, + "displayName": "mclo.gs v1.3.0 for Forge 1.16.5", + "fileName": "mclogs-forge-1.3.0-for-1.16.5.jar", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "12513f69eee677f5763026621734b97af4841233", + "algo": 1 + }, + { + "value": "f74210999c2e175480ac39521e95afdf", + "algo": 2 + } + ], + "fileDate": "2021-12-07T16:37:02.75Z", + "fileLength": 31346, + "downloadCount": 200, + "downloadUrl": "https://edge.forgecdn.net/files/3553/911/mclogs-forge-1.3.0-for-1.16.5.jar", + "gameVersions": [ + "1.16.3", + "1.16.1", + "1.16", + "1.16.4", + "1.16.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.16.3", + "gameVersionPadded": "0000000001.0000000016.0000000003", + "gameVersion": "1.16.3", + "gameVersionReleaseDate": "2020-09-10T14:44:20.443Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16.1", + "gameVersionPadded": "0000000001.0000000016.0000000001", + "gameVersion": "1.16.1", + "gameVersionReleaseDate": "2020-06-24T12:41:11.823Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16", + "gameVersionPadded": "0000000001.0000000016", + "gameVersion": "1.16", + "gameVersionReleaseDate": "2020-06-23T13:41:08.75Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16.4", + "gameVersionPadded": "0000000001.0000000016.0000000004", + "gameVersion": "1.16.4", + "gameVersionReleaseDate": "2020-11-02T18:40:51.49Z", + "gameVersionTypeId": 70886 + }, + { + "gameVersionName": "1.16.2", + "gameVersionPadded": "0000000001.0000000016.0000000002", + "gameVersion": "1.16.2", + "gameVersionReleaseDate": "2020-08-11T16:42:21.863Z", + "gameVersionTypeId": 70886 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 2703393364, + "modules": [] + }, + { + "id": 6235017, + "gameId": 432, + "modId": 420561, + "isAvailable": true, + "displayName": "mclogs-fabric-1.21.4-3.0.0-dev.jar", + "fileName": "mclogs-fabric-1.21.4-3.0.0-dev.jar", + "releaseType": 3, + "fileStatus": 4, + "hashes": [ + { + "value": "13632ac8a83563aa3836139781d62134d376624b", + "algo": 1 + }, + { + "value": "230ce06a7f88484a6c615869bcc06126", + "algo": 2 + } + ], + "fileDate": "2025-02-25T15:59:14.99Z", + "fileLength": 64225, + "downloadCount": 8, + "fileSizeOnDisk": 144589, + "downloadUrl": "https://edge.forgecdn.net/files/6235/17/mclogs-fabric-1.21.4-3.0.0-dev.jar", + "gameVersions": [ + "1.21", + "Fabric", + "1.21.4", + "1.21.3", + "1.21.1", + "1.21.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "1.21", + "gameVersionPadded": "0000000001.0000000021", + "gameVersion": "1.21", + "gameVersionReleaseDate": "2024-06-14T00:00:00Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "Fabric", + "gameVersionPadded": "0", + "gameVersion": "", + "gameVersionReleaseDate": "2022-09-01T00:00:00Z", + "gameVersionTypeId": 68441 + }, + { + "gameVersionName": "1.21.4", + "gameVersionPadded": "0000000001.0000000021.0000000004", + "gameVersion": "1.21.4", + "gameVersionReleaseDate": "2024-12-03T16:26:15.35Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.3", + "gameVersionPadded": "0000000001.0000000021.0000000003", + "gameVersion": "1.21.3", + "gameVersionReleaseDate": "2024-10-23T13:16:45.71Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.1", + "gameVersionPadded": "0000000001.0000000021.0000000001", + "gameVersion": "1.21.1", + "gameVersionReleaseDate": "2024-08-08T15:17:53.787Z", + "gameVersionTypeId": 77784 + }, + { + "gameVersionName": "1.21.2", + "gameVersionPadded": "0000000001.0000000021.0000000002", + "gameVersion": "1.21.2", + "gameVersionReleaseDate": "2024-10-22T00:00:00Z", + "gameVersionTypeId": 77784 + } + ], + "dependencies": [ + { + "modId": 306612, + "relationType": 3 + } + ], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 3226610985, + "modules": [ + { + "name": "META-INF", + "fingerprint": 3437539353 + }, + { + "name": "gs", + "fingerprint": 2144871004 + }, + { + "name": "fabric.mod.json", + "fingerprint": 702809486 + }, + { + "name": "assets", + "fingerprint": 2196086191 + }, + { + "name": "pack.mcmeta", + "fingerprint": 845577715 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "26.1", + "fileId": 8946029, + "filename": "mclogs-neoforge-26.1-3.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 83806, + "modLoader": 6 + }, + { + "gameVersion": "26.1.1", + "fileId": 8946029, + "filename": "mclogs-neoforge-26.1-3.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 83806, + "modLoader": 6 + }, + { + "gameVersion": "26.1.2", + "fileId": 8946029, + "filename": "mclogs-neoforge-26.1-3.3.4.jar", + "releaseType": 1, + "gameVersionTypeId": 83806, + "modLoader": 6 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2020-11-17T21:36:28.057Z", + "dateModified": "2026-09-22T10:03:46.67Z", + "dateReleased": "2026-09-22T09:44:53.913Z", + "allowModDistribution": true, + "gamePopularityRank": 13195, + "isAvailable": true, + "hasCommentsEnabled": true, + "licenseType": "MIT License", + "thumbsUpCount": 0, + "featuredProjectTag": 0 + }, + { + "screenshots": [], + "id": 278568, + "gameId": 432, + "name": "Mclogs - mclo.gs", + "slug": "mclogs", + "links": { + "websiteUrl": "https://www.curseforge.com/minecraft/bukkit-plugins/mclogs", + "wikiUrl": "", + "issuesUrl": "https://github.com/aternosorg/mclogs-integration/issues", + "sourceUrl": "https://github.com/aternosorg/mclogs-integration" + }, + "summary": "Share your Minecraft server log directly from your server with one simple command. ", + "status": 4, + "downloadCount": 7632, + "favoriteCount": 3, + "isFeatured": false, + "primaryCategoryId": 115, + "categories": [ + { + "id": 117, + "gameId": 432, + "name": "Chat Related", + "slug": "chat-related", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/chat-related", + "iconUrl": "https://media.forgecdn.net/avatars/65/450/636162917920915559.png", + "dateModified": "2016-12-02T22:09:52.09Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + }, + { + "id": 115, + "gameId": 432, + "name": "Admin Tools", + "slug": "admin-tools", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/admin-tools", + "iconUrl": "https://media.forgecdn.net/avatars/65/448/636162917918103026.png", + "dateModified": "2016-12-02T22:09:51.92Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + }, + { + "id": 127, + "gameId": 432, + "name": "General", + "slug": "general", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/general", + "iconUrl": "https://media.forgecdn.net/avatars/65/456/636162917924196887.png", + "dateModified": "2016-12-02T22:09:52.42Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + }, + { + "id": 128, + "gameId": 432, + "name": "Informational", + "slug": "informational", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/informational", + "iconUrl": "https://media.forgecdn.net/avatars/65/457/636162917924665620.png", + "dateModified": "2016-12-02T22:09:52.467Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + }, + { + "id": 133, + "gameId": 432, + "name": "Miscellaneous", + "slug": "miscellaneous", + "url": "https://www.curseforge.com/minecraft/bukkit-plugins/miscellaneous", + "iconUrl": "https://media.forgecdn.net/avatars/65/462/636162917926853172.png", + "dateModified": "2016-12-02T22:09:52.7Z", + "isClass": false, + "classId": 5, + "parentCategoryId": 5 + } + ], + "classId": 5, + "authors": [ + { + "id": 15007584, + "name": "Aternos", + "url": "https://www.curseforge.com/members/aternos", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/aac8fc81-daa4-4784-a43b-1d6ab1d4c6fb-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 2, + "downloadsThreshold": 500000 + } + }, + { + "id": 21438892, + "name": "JulianVennen", + "url": "https://www.curseforge.com/members/julianvennen", + "avatarUrl": "https://static-cdn.jtvnw.net/jtv_user_pictures/244694d8-83b9-408c-924a-38d0f4116352-profile_image-150x150.png", + "userTierInfo": { + "tierLevel": 0, + "downloadsThreshold": 0 + } + } + ], + "logo": { + "id": 1659422, + "modId": 278568, + "title": "639057206113140311.png", + "description": "", + "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/1659/422/256/256/639057206113140311.png", + "url": "https://media.forgecdn.net/avatars/1659/422/639057206113140311.png" + }, + "mainFileId": 8641361, + "latestFiles": [ + { + "id": 8641361, + "gameId": 432, + "modId": 278568, + "isAvailable": true, + "displayName": "mclogs-bukkit-26.1-3.3.2.jar", + "fileName": "mclogs-bukkit-26.1-3.3.2.jar", + "releaseType": 1, + "fileStatus": 4, + "hashes": [ + { + "value": "a75daf6b5bb4d45029292f447362b5cdb0c49bbd", + "algo": 1 + }, + { + "value": "f5e9ceb5eff0e46698e94aa36f64c116", + "algo": 2 + } + ], + "fileDate": "2026-08-13T16:53:55.04Z", + "fileLength": 1586301, + "downloadCount": 5, + "fileSizeOnDisk": 3697173, + "downloadUrl": "https://edge.forgecdn.net/files/8641/361/mclogs-bukkit-26.1-3.3.2.jar", + "gameVersions": [ + "26.1.1", + "26.1", + "26.1.2", + "26.2" + ], + "sortableGameVersions": [ + { + "gameVersionName": "26.1.1", + "gameVersionPadded": "0000000026.0000000001.0000000001", + "gameVersion": "26.1.1", + "gameVersionReleaseDate": "2026-04-09T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "26.1", + "gameVersionPadded": "0000000026.0000000001", + "gameVersion": "26.1", + "gameVersionReleaseDate": "2026-04-09T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "26.1.2", + "gameVersionPadded": "0000000026.0000000001.0000000002", + "gameVersion": "26.1.2", + "gameVersionReleaseDate": "2026-04-09T00:00:00Z", + "gameVersionTypeId": 1 + }, + { + "gameVersionName": "26.2", + "gameVersionPadded": "0000000026.0000000002", + "gameVersion": "26.2", + "gameVersionReleaseDate": "2026-06-16T00:00:00Z", + "gameVersionTypeId": 1 + } + ], + "dependencies": [], + "alternateFileId": 0, + "isServerPack": false, + "fileFingerprint": 528184115, + "modules": [ + { + "name": "META-INF", + "fingerprint": 4058928240 + }, + { + "name": "gs", + "fingerprint": 1327173963 + }, + { + "name": "plugin.yml", + "fingerprint": 4207311037 + }, + { + "name": "org", + "fingerprint": 3750992258 + }, + { + "name": "com", + "fingerprint": 4021501202 + }, + { + "name": "net", + "fingerprint": 3310300148 + } + ] + } + ], + "latestFilesIndexes": [ + { + "gameVersion": "26.1.1", + "fileId": 8641361, + "filename": "mclogs-bukkit-26.1-3.3.2.jar", + "releaseType": 1, + "gameVersionTypeId": 1 + }, + { + "gameVersion": "26.1", + "fileId": 8641361, + "filename": "mclogs-bukkit-26.1-3.3.2.jar", + "releaseType": 1, + "gameVersionTypeId": 1 + }, + { + "gameVersion": "26.1.2", + "fileId": 8641361, + "filename": "mclogs-bukkit-26.1-3.3.2.jar", + "releaseType": 1, + "gameVersionTypeId": 1 + } + ], + "latestEarlyAccessFilesIndexes": [], + "dateCreated": "2017-09-22T20:06:09.267Z", + "dateModified": "2026-08-13T17:03:39.103Z", + "dateReleased": "2026-08-13T16:53:55.04Z", + "allowModDistribution": true, + "gamePopularityRank": 58020, + "isAvailable": true, + "hasCommentsEnabled": true, + "licenseType": "MIT License", + "thumbsUpCount": 0, + "featuredProjectTag": 0 + } + ], + "pagination": { + "index": 0, + "pageSize": 2, + "resultCount": 2, + "totalCount": 2 + } +} From 7b6a03e27f495c2c49e35d89af25622cd8cd5ccb Mon Sep 17 00:00:00 2001 From: Paul Vogel Date: Fri, 16 Oct 2026 11:38:36 +0200 Subject: [PATCH 2/2] sort imports after merge --- tests/Unit/Client/CurseForgeAPIClientTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Unit/Client/CurseForgeAPIClientTest.php b/tests/Unit/Client/CurseForgeAPIClientTest.php index 9877c16..3520e7c 100644 --- a/tests/Unit/Client/CurseForgeAPIClientTest.php +++ b/tests/Unit/Client/CurseForgeAPIClientTest.php @@ -3,18 +3,18 @@ namespace Aternos\CurseForgeApi\Tests\Unit\Client; use Aternos\CurseForgeApi\ApiException; -use Aternos\CurseForgeApi\Client\Mod; -use Aternos\CurseForgeApi\Client\Options\ModSearchOptions; use Aternos\CurseForgeApi\Client\Category; use Aternos\CurseForgeApi\Client\Game; use Aternos\CurseForgeApi\Client\GameVersionType; +use Aternos\CurseForgeApi\Client\Mod; +use Aternos\CurseForgeApi\Client\Options\ModSearchOptions; use Aternos\CurseForgeApi\Configuration; +use Aternos\CurseForgeApi\Model\GameVersion; +use Aternos\CurseForgeApi\Model\GameVersionsByTypeV2; use Aternos\CurseForgeApi\Model\ModLoaderType; use Aternos\CurseForgeApi\Model\ModSearchSortField; use Aternos\CurseForgeApi\Model\PremiumType; use Aternos\CurseForgeApi\Model\SortOrder; -use Aternos\CurseForgeApi\Model\GameVersion; -use Aternos\CurseForgeApi\Model\GameVersionsByTypeV2; use GuzzleHttp\Client; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack;