chore(media-upload): remove Postimages provider

Postimages cannot support WebView automation (site blocks automated uploads).
Imgur works reliably. Keep only Catbox and Imgur as supported providers.
This commit is contained in:
plebeius
2026-02-28 19:13:43 +08:00
parent 274a6fb4b1
commit 7fd3e3fd45
28 changed files with 389 additions and 727 deletions
@@ -33,13 +33,6 @@ public class MediaUploadRecipesTest {
MediaUploadRecipes.getUploadUrl(MediaUploadRecipes.PROVIDER_IMGUR));
}
@Test
public void getUploadUrl_postimages() {
assertEquals(
"https://postimages.org",
MediaUploadRecipes.getUploadUrl(MediaUploadRecipes.PROVIDER_POSTIMAGES));
}
@Test
public void getUploadUrl_unknownProvider_returnsNull() {
assertNull(MediaUploadRecipes.getUploadUrl("catbox"));
@@ -55,14 +48,6 @@ public class MediaUploadRecipesTest {
assertTrue(js.contains("data-file-input"));
}
@Test
public void getTriggerFileInputJs_postimages_containsSelectors() {
String js = MediaUploadRecipes.getTriggerFileInputJs(MediaUploadRecipes.PROVIDER_POSTIMAGES);
assertNotNull(js);
assertTrue(js.contains("input[type=\"file\"]") || js.contains("input[type=file]"));
assertTrue(js.contains("uploadFile") || js.contains("fileinput"));
}
@Test
public void getTriggerFileInputJs_unknownProvider_returnsNull() {
assertNull(MediaUploadRecipes.getTriggerFileInputJs("unknown"));
@@ -76,13 +61,6 @@ public class MediaUploadRecipesTest {
assertTrue(js.contains("click"));
}
@Test
public void getSubmitClickJs_postimages_returnsValidJs() {
String js = MediaUploadRecipes.getSubmitClickJs(MediaUploadRecipes.PROVIDER_POSTIMAGES);
assertNotNull(js);
assertTrue(js.contains("querySelector"));
}
@Test
public void getSuccessJs_imgur_containsImgurSelectors() {
String js = MediaUploadRecipes.getSuccessJs(MediaUploadRecipes.PROVIDER_IMGUR);
@@ -90,13 +68,6 @@ public class MediaUploadRecipesTest {
assertTrue(js.contains("i.imgur.com"));
}
@Test
public void getSuccessJs_postimages_containsPostimgSelectors() {
String js = MediaUploadRecipes.getSuccessJs(MediaUploadRecipes.PROVIDER_POSTIMAGES);
assertNotNull(js);
assertTrue(js.contains("postimg"));
}
@Test
public void getBlockedJs_imgur_containsChallengeSelectors() {
String js = MediaUploadRecipes.getBlockedJs(MediaUploadRecipes.PROVIDER_IMGUR);
@@ -104,13 +75,6 @@ public class MediaUploadRecipesTest {
assertTrue(js.contains("challenge") || js.contains("captcha") || js.contains("recaptcha"));
}
@Test
public void getBlockedJs_postimages_containsBlockedIndicators() {
String js = MediaUploadRecipes.getBlockedJs(MediaUploadRecipes.PROVIDER_POSTIMAGES);
assertNotNull(js);
assertTrue(js.contains("challenge") || js.contains("captcha"));
}
@Test
public void failureClassification_inputNotFound_stageConstant() {
assertEquals(MediaUploadAutomationRunner.STAGE_INPUT_NOT_FOUND, "input_not_found");
@@ -138,26 +102,4 @@ public class MediaUploadRecipesTest {
assertTrue(js.contains("JSON.stringify") || js.contains("return"));
}
/** Postimages selector contract: no broad non-input fallback; strict INPUT type=file guard. */
@Test
public void postimages_triggerJs_hasStrictInputOnlyGuard() {
String js = MediaUploadRecipes.getTriggerFileInputJs(MediaUploadRecipes.PROVIDER_POSTIMAGES);
assertNotNull(js);
assertTrue(
"Postimages must enforce actual file input; guard rejects non-input elements",
js.contains("tagName") && js.contains("INPUT") && js.contains("type") && js.contains("file"));
}
@Test
public void postimages_triggerJs_stricterThanImgur() {
String imgurJs = MediaUploadRecipes.getTriggerFileInputJs(MediaUploadRecipes.PROVIDER_IMGUR);
String postimagesJs =
MediaUploadRecipes.getTriggerFileInputJs(MediaUploadRecipes.PROVIDER_POSTIMAGES);
assertNotNull(imgurJs);
assertNotNull(postimagesJs);
assertFalse("Imgur has no strict input guard", imgurJs.contains("tagName"));
assertTrue(
"Postimages must enforce strict input-only; no broad non-input fallback",
postimagesJs.contains("tagName"));
}
}