| 366 | | |
| 367 | | /** |
| 368 | | * Test creating the original image mime type when the image is uploaded. |
| 369 | | * |
| 370 | | * @ticket 55443 |
| 371 | | * |
| 372 | | * @dataProvider provider_image_with_default_behaviors_during_upload |
| 373 | | */ |
| 374 | | public function it_should_create_the_original_image_mime_type_when_the_image_is_uploaded( $file_location, $expected_mime, $targeted_mime ) { |
| 375 | | $attachment_id = $this->factory->attachment->create_upload_object( $file_location ); |
| 376 | | |
| 377 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 378 | | |
| 379 | | $this->assertIsArray( $metadata ); |
| 380 | | foreach ( $metadata['sizes'] as $size_name => $properties ) { |
| 381 | | $this->assertArrayHasKey( 'sources', $properties ); |
| 382 | | $this->assertIsArray( $properties['sources'] ); |
| 383 | | $this->assertArrayHasKey( $expected_mime, $properties['sources'] ); |
| 384 | | $this->assertArrayHasKey( 'filesize', $properties['sources'][ $expected_mime ] ); |
| 385 | | $this->assertArrayHasKey( 'file', $properties['sources'][ $expected_mime ] ); |
| 386 | | $this->assertArrayHasKey( $targeted_mime, $properties['sources'] ); |
| 387 | | $this->assertArrayHasKey( 'filesize', $properties['sources'][ $targeted_mime ] ); |
| 388 | | $this->assertArrayHasKey( 'file', $properties['sources'][ $targeted_mime ] ); |
| 389 | | } |
| 390 | | } |
| 391 | | |
| 392 | | /** |
| 393 | | * Data provider for it_should_create_the_original_image_mime_type_when_the_image_is_uploaded. |
| 394 | | */ |
| 395 | | public function provider_image_with_default_behaviors_during_upload() { |
| 396 | | yield 'JPEG image' => array( |
| 397 | | DIR_TESTDATA . '/images/test-image.jpg', |
| 398 | | 'image/jpeg', |
| 399 | | 'image/webp', |
| 400 | | ); |
| 401 | | |
| 402 | | yield 'WebP image' => array( |
| 403 | | DIR_TESTDATA . '/images/webp-lossy.webp', |
| 404 | | 'image/webp', |
| 405 | | 'image/jpeg', |
| 406 | | ); |
| 407 | | } |
| 408 | | |
| 409 | | /** |
| 410 | | * Test Do not create the sources property if no transform is provided. |
| 411 | | * |
| 412 | | * @ticket 55443 |
| 413 | | */ |
| 414 | | public function it_should_not_create_the_sources_property_if_no_transform_is_provided() { |
| 415 | | add_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' ); |
| 416 | | |
| 417 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 418 | | DIR_TESTDATA . '/images/test-image.jpg' |
| 419 | | ); |
| 420 | | |
| 421 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 422 | | |
| 423 | | $this->assertIsArray( $metadata ); |
| 424 | | foreach ( $metadata['sizes'] as $size_name => $properties ) { |
| 425 | | $this->assertArrayNotHasKey( 'sources', $properties ); |
| 426 | | } |
| 427 | | } |
| 428 | | |
| 429 | | /** |
| 430 | | * Test creating the sources property when no transform is available. |
| 431 | | * |
| 432 | | * @ticket 55443 |
| 433 | | */ |
| 434 | | public function it_should_create_the_sources_property_when_no_transform_is_available() { |
| 435 | | add_filter( |
| 436 | | 'wp_upload_image_mime_transforms', |
| 437 | | function () { |
| 438 | | return array( 'image/jpeg' => array() ); |
| 439 | | } |
| 440 | | ); |
| 441 | | |
| 442 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 443 | | DIR_TESTDATA . '/images/test-image.jpg' |
| 444 | | ); |
| 445 | | |
| 446 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 447 | | |
| 448 | | $this->assertIsArray( $metadata ); |
| 449 | | foreach ( $metadata['sizes'] as $size_name => $properties ) { |
| 450 | | $this->assertArrayHasKey( 'sources', $properties ); |
| 451 | | $this->assertIsArray( $properties['sources'] ); |
| 452 | | $this->assertArrayHasKey( 'image/jpeg', $properties['sources'] ); |
| 453 | | $this->assertArrayHasKey( 'filesize', $properties['sources']['image/jpeg'] ); |
| 454 | | $this->assertArrayHasKey( 'file', $properties['sources']['image/jpeg'] ); |
| 455 | | $this->assertArrayNotHasKey( 'image/webp', $properties['sources'] ); |
| 456 | | } |
| 457 | | } |
| 458 | | |
| 459 | | /** |
| 460 | | * Test not creating the sources property if the mime is not specified on the transforms images. |
| 461 | | * |
| 462 | | * @ticket 55443 |
| 463 | | */ |
| 464 | | public function it_should_not_create_the_sources_property_if_the_mime_is_not_specified_on_the_transforms_images() { |
| 465 | | add_filter( |
| 466 | | 'wp_upload_image_mime_transforms', |
| 467 | | function () { |
| 468 | | return array( 'image/jpeg' => array() ); |
| 469 | | } |
| 470 | | ); |
| 471 | | |
| 472 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 473 | | DIR_TESTDATA . '/images/webp-lossy.webp' |
| 474 | | ); |
| 475 | | |
| 476 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 477 | | |
| 478 | | $this->assertIsArray( $metadata ); |
| 479 | | foreach ( $metadata['sizes'] as $size_name => $properties ) { |
| 480 | | $this->assertArrayNotHasKey( 'sources', $properties ); |
| 481 | | } |
| 482 | | } |
| 483 | | |
| 484 | | |
| 485 | | /** |
| 486 | | * Test creating a WebP version with all the required properties. |
| 487 | | * |
| 488 | | * @ticket 55443 |
| 489 | | */ |
| 490 | | public function it_should_create_a_webp_version_with_all_the_required_properties() { |
| 491 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 492 | | DIR_TESTDATA . '/images/test-image.jpg' |
| 493 | | ); |
| 494 | | |
| 495 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 496 | | $this->assertArrayHasKey( 'sources', $metadata['sizes']['thumbnail'] ); |
| 497 | | $this->assertArrayHasKey( 'image/jpeg', $metadata['sizes']['thumbnail']['sources'] ); |
| 498 | | $this->assertArrayHasKey( 'filesize', $metadata['sizes']['thumbnail']['sources']['image/jpeg'] ); |
| 499 | | $this->assertArrayHasKey( 'file', $metadata['sizes']['thumbnail']['sources']['image/jpeg'] ); |
| 500 | | $this->assertArrayHasKey( 'image/webp', $metadata['sizes']['thumbnail']['sources'] ); |
| 501 | | $this->assertArrayHasKey( 'filesize', $metadata['sizes']['thumbnail']['sources']['image/webp'] ); |
| 502 | | $this->assertArrayHasKey( 'file', $metadata['sizes']['thumbnail']['sources']['image/webp'] ); |
| 503 | | $this->assertStringEndsNotWith( '.jpeg', $metadata['sizes']['thumbnail']['sources']['image/webp']['file'] ); |
| 504 | | $this->assertStringEndsWith( '.webp', $metadata['sizes']['thumbnail']['sources']['image/webp']['file'] ); |
| 505 | | } |
| 506 | | |
| 507 | | /** |
| 508 | | * Test removing `scaled` suffix from the generated filename. |
| 509 | | * |
| 510 | | * @ticket 55443 |
| 511 | | */ |
| 512 | | public function it_should_remove_scaled_suffix_from_the_generated_filename() { |
| 513 | | // The leafs image is 1080 pixels wide with this filter we ensure a -scaled version is created. |
| 514 | | add_filter( |
| 515 | | 'big_image_size_threshold', |
| 516 | | function () { |
| 517 | | return 850; |
| 518 | | } |
| 519 | | ); |
| 520 | | |
| 521 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 522 | | DIR_TESTDATA . '/images/test-image.jpg' |
| 523 | | ); |
| 524 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 525 | | $this->assertStringEndsWith( '-scaled.jpg', get_attached_file( $attachment_id ) ); |
| 526 | | $this->assertArrayHasKey( 'image/webp', $metadata['sizes']['medium']['sources'] ); |
| 527 | | $this->assertStringEndsNotWith( '-scaled.webp', $metadata['sizes']['medium']['sources']['image/webp']['file'] ); |
| 528 | | $this->assertStringEndsWith( '-300x200.webp', $metadata['sizes']['medium']['sources']['image/webp']['file'] ); |
| 529 | | } |
| 530 | | |
| 531 | | /** |
| 532 | | * Test removing the generated webp images when the attachment is deleted. |
| 533 | | * |
| 534 | | * @ticket 55443 |
| 535 | | */ |
| 536 | | public function it_should_remove_the_generated_webp_images_when_the_attachment_is_deleted() { |
| 537 | | // Make sure no editor is available. |
| 538 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 539 | | DIR_TESTDATA . '/images/test-image.jpg' |
| 540 | | ); |
| 541 | | |
| 542 | | $file = get_attached_file( $attachment_id, true ); |
| 543 | | $dirname = pathinfo( $file, PATHINFO_DIRNAME ); |
| 544 | | |
| 545 | | $this->assertIsString( $file ); |
| 546 | | $this->assertFileExists( $file ); |
| 547 | | |
| 548 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 549 | | $sizes = array( 'thumbnail', 'medium' ); |
| 550 | | |
| 551 | | foreach ( $sizes as $size_name ) { |
| 552 | | $this->assertArrayHasKey( 'image/webp', $metadata['sizes'][ $size_name ]['sources'] ); |
| 553 | | $this->assertArrayHasKey( 'file', $metadata['sizes'][ $size_name ]['sources']['image/webp'] ); |
| 554 | | $this->assertFileExists( |
| 555 | | path_join( $dirname, $metadata['sizes'][ $size_name ]['sources']['image/webp']['file'] ) |
| 556 | | ); |
| 557 | | } |
| 558 | | |
| 559 | | wp_delete_attachment( $attachment_id ); |
| 560 | | |
| 561 | | foreach ( $sizes as $size_name ) { |
| 562 | | $this->assertFileDoesNotExist( |
| 563 | | path_join( $dirname, $metadata['sizes'][ $size_name ]['sources']['image/webp']['file'] ) |
| 564 | | ); |
| 565 | | } |
| 566 | | } |
| 567 | | |
| 568 | | /** |
| 569 | | * Test removing the attached WebP version if the attachment is force deleted but empty trash day is not defined. |
| 570 | | * |
| 571 | | * @ticket 55443 |
| 572 | | */ |
| 573 | | public function it_should_remove_the_attached_webp_version_if_the_attachment_is_force_deleted_but_empty_trash_day_is_not_defined() { |
| 574 | | // Make sure no editor is available. |
| 575 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 576 | | DIR_TESTDATA . '/images/test-image.jpg' |
| 577 | | ); |
| 578 | | |
| 579 | | $file = get_attached_file( $attachment_id, true ); |
| 580 | | $dirname = pathinfo( $file, PATHINFO_DIRNAME ); |
| 581 | | |
| 582 | | $this->assertIsString( $file ); |
| 583 | | $this->assertFileExists( $file ); |
| 584 | | |
| 585 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 586 | | |
| 587 | | $this->assertFileExists( |
| 588 | | path_join( $dirname, $metadata['sizes']['thumbnail']['sources']['image/webp']['file'] ) |
| 589 | | ); |
| 590 | | |
| 591 | | wp_delete_attachment( $attachment_id, true ); |
| 592 | | |
| 593 | | $this->assertFileDoesNotExist( |
| 594 | | path_join( $dirname, $metadata['sizes']['thumbnail']['sources']['image/webp']['file'] ) |
| 595 | | ); |
| 596 | | } |
| 597 | | |
| 598 | | /** |
| 599 | | * Test removing the WebP version of the image if the image is force deleted and empty trash days is set to zero. |
| 600 | | * |
| 601 | | * @ticket 55443 |
| 602 | | */ |
| 603 | | public function it_should_remove_the_webp_version_of_the_image_if_the_image_is_force_deleted_and_empty_trash_days_is_set_to_zero() { |
| 604 | | // Make sure no editor is available. |
| 605 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 606 | | DIR_TESTDATA . '/images/test-image.jpg' |
| 607 | | ); |
| 608 | | |
| 609 | | $file = get_attached_file( $attachment_id, true ); |
| 610 | | $dirname = pathinfo( $file, PATHINFO_DIRNAME ); |
| 611 | | |
| 612 | | $this->assertIsString( $file ); |
| 613 | | $this->assertFileExists( $file ); |
| 614 | | |
| 615 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 616 | | |
| 617 | | $this->assertFileExists( |
| 618 | | path_join( $dirname, $metadata['sizes']['thumbnail']['sources']['image/webp']['file'] ) |
| 619 | | ); |
| 620 | | |
| 621 | | define( 'EMPTY_TRASH_DAYS', 0 ); |
| 622 | | |
| 623 | | wp_delete_attachment( $attachment_id, true ); |
| 624 | | |
| 625 | | $this->assertFileDoesNotExist( |
| 626 | | path_join( $dirname, $metadata['sizes']['thumbnail']['sources']['image/webp']['file'] ) |
| 627 | | ); |
| 628 | | } |
| 629 | | |
| 630 | | /** |
| 631 | | * Test avoiding the change of URLs of images that are not part of the media library. |
| 632 | | * |
| 633 | | * @ticket 55443 |
| 634 | | */ |
| 635 | | public function it_should_avoid_the_change_of_urls_of_images_that_are_not_part_of_the_media_library() { |
| 636 | | $paragraph = '<p>Donec accumsan, sapien et <img src="https://ia600200.us.archive.org/16/items/SPD-SLRSY-1867/hubblesite_2001_06.jpg">, id commodo nisi sapien et est. Mauris nisl odio, iaculis vitae pellentesque nec.</p>'; |
| 637 | | |
| 638 | | $this->assertSame( $paragraph, webp_uploads_update_image_references( $paragraph ) ); |
| 639 | | } |
| 640 | | |
| 641 | | /** |
| 642 | | * Test avoiding replacing not existing attachment IDs. |
| 643 | | * |
| 644 | | * @ticket 55443 |
| 645 | | */ |
| 646 | | public function it_should_avoid_replacing_not_existing_attachment_i_ds() { |
| 647 | | $paragraph = '<p>Donec accumsan, sapien et <img class="wp-image-0" src="https://ia600200.us.archive.org/16/items/SPD-SLRSY-1867/hubblesite_2001_06.jpg">, id commodo nisi sapien et est. Mauris nisl odio, iaculis vitae pellentesque nec.</p>'; |
| 648 | | |
| 649 | | $this->assertSame( $paragraph, webp_uploads_update_image_references( $paragraph ) ); |
| 650 | | } |
| 651 | | |
| 652 | | /** |
| 653 | | * Test preventing replacing a WebP image. |
| 654 | | * |
| 655 | | * @ticket 55443 |
| 656 | | */ |
| 657 | | public function it_should_test_preventing_replacing_a_webp_image() { |
| 658 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 659 | | DIR_TESTDATA . '/images/webp-lossy.webp' |
| 660 | | ); |
| 661 | | |
| 662 | | $tag = wp_get_attachment_image( $attachment_id, 'medium', false, array( 'class' => "wp-image-{$attachment_id}" ) ); |
| 663 | | |
| 664 | | $this->assertSame( $tag, webp_uploads_img_tag_update_mime_type( $tag, 'the_content', $attachment_id ) ); |
| 665 | | } |
| 666 | | |
| 667 | | /** |
| 668 | | * Test preventing replacing a jpg image if the image does not have the target class name. |
| 669 | | * |
| 670 | | * @ticket 55443 |
| 671 | | */ |
| 672 | | public function it_should_test_preventing_replacing_a_jpg_image_if_the_image_does_not_have_the_target_class_name() { |
| 673 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 674 | | DIR_TESTDATA . '/images/test-image.jpg' |
| 675 | | ); |
| 676 | | |
| 677 | | $tag = wp_get_attachment_image( $attachment_id, 'medium' ); |
| 678 | | |
| 679 | | $this->assertSame( $tag, webp_uploads_update_image_references( $tag ) ); |
| 680 | | } |
| 681 | | |
| 682 | | /** |
| 683 | | * Test replacing the references to a JPG image to a WebP version. |
| 684 | | * |
| 685 | | * @dataProvider provider_replace_images_with_different_extensions |
| 686 | | * |
| 687 | | * @ticket 55443 |
| 688 | | */ |
| 689 | | public function it_should_replace_the_references_to_a_jpg_image_to_a_webp_version( $image_path ) { |
| 690 | | $attachment_id = $this->factory->attachment->create_upload_object( $image_path ); |
| 691 | | |
| 692 | | $tag = wp_get_attachment_image( $attachment_id, 'medium', false, array( 'class' => "wp-image-{$attachment_id}" ) ); |
| 693 | | $expected_tag = $tag; |
| 694 | | $metadata = wp_get_attachment_metadata( $attachment_id ); |
| 695 | | foreach ( $metadata['sizes'] as $size => $properties ) { |
| 696 | | $expected_tag = str_replace( $properties['sources']['image/jpeg']['file'], $properties['sources']['image/webp']['file'], $expected_tag ); |
| 697 | | } |
| 698 | | |
| 699 | | $this->assertNotEmpty( $expected_tag ); |
| 700 | | $this->assertNotSame( $tag, $expected_tag ); |
| 701 | | $this->assertSame( $expected_tag, webp_uploads_img_tag_update_mime_type( $tag, 'the_content', $attachment_id ) ); |
| 702 | | } |
| 703 | | |
| 704 | | public function provider_replace_images_with_different_extensions() { |
| 705 | | yield 'An image with a .jpg extension' => array( DIR_TESTDATA . '/images/test-image.jpg' ); |
| 706 | | yield 'An image with a .jpeg extension' => array( DIR_TESTDATA . '/images/test-image.jpeg' ); |
| 707 | | } |
| 708 | | |
| 709 | | /** |
| 710 | | * Test the full image size from the original mime type. |
| 711 | | * |
| 712 | | * @ticket 55443 |
| 713 | | */ |
| 714 | | public function it_should_contain_the_full_image_size_from_the_original_mime() { |
| 715 | | $attachment_id = $this->factory->attachment->create_upload_object( |
| 716 | | DIR_TESTDATA . '/images/test-image.jpg' |
| 717 | | ); |
| 718 | | |
| 719 | | $tag = wp_get_attachment_image( $attachment_id, 'full', false, array( 'class' => "wp-image-{$attachment_id}" ) ); |
| 720 | | |
| 721 | | $expected = array( |
| 722 | | 'ext' => 'jpg', |
| 723 | | 'type' => 'image/jpeg', |
| 724 | | ); |
| 725 | | $this->assertSame( $expected, wp_check_filetype( get_attached_file( $attachment_id ) ) ); |
| 726 | | $this->assertContains( wp_basename( get_attached_file( $attachment_id ) ), webp_uploads_img_tag_update_mime_type( $tag, 'the_content', $attachment_id ) ); |
| 727 | | } |
| 728 | | |
| 729 | | /** |
| 730 | | * Test preventing replacing an image with no available sources. |
| 731 | | * |
| 732 | | * @ticket 55443 |
| 733 | | */ |
| 734 | | public function it_should_prevent_replacing_an_image_with_no_available_sources() { |
| 735 | | add_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' ); |
| 736 | | |
| 737 | | $attachment_id = $this->factory->attachment->create_upload_object( DIR_TESTDATA . '/images/test-image.jpg' ); |
| 738 | | |
| 739 | | $tag = wp_get_attachment_image( $attachment_id, 'full', false, array( 'class' => "wp-image-{$attachment_id}" ) ); |
| 740 | | $this->assertSame( $tag, webp_uploads_img_tag_update_mime_type( $tag, 'the_content', $attachment_id ) ); |
| 741 | | } |
| 742 | | |
| 743 | | /** |
| 744 | | * Test preventing update not supported images with no available sources. |
| 745 | | * |
| 746 | | * @dataProvider provider_it_should_prevent_update_not_supported_images_with_no_available_sources |
| 747 | | * |
| 748 | | * @ticket 55443 |
| 749 | | */ |
| 750 | | public function it_should_prevent_update_not_supported_images_with_no_available_sources( $image_path ) { |
| 751 | | $attachment_id = $this->factory->attachment->create_upload_object( $image_path ); |
| 752 | | |
| 753 | | $this->assertIsNumeric( $attachment_id ); |
| 754 | | $tag = wp_get_attachment_image( $attachment_id, 'full', false, array( 'class' => "wp-image-{$attachment_id}" ) ); |
| 755 | | |
| 756 | | $this->assertSame( $tag, webp_uploads_img_tag_update_mime_type( $tag, 'the_content', $attachment_id ) ); |
| 757 | | } |
| 758 | | |
| 759 | | /** |
| 760 | | * Data provider for it_should_prevent_update_not_supported_images_with_no_available_sources. |
| 761 | | */ |
| 762 | | public function provider_it_should_prevent_update_not_supported_images_with_no_available_sources() { |
| 763 | | yield 'PNG image' => array( DIR_TESTDATA . '/images/test-image.png' ); |
| 764 | | yield 'GIFT image' => array( DIR_TESTDATA . '/images/test-image.gif' ); |
| 765 | | } |
| 766 | | |