// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/autofill/model/autofill_image_fetcher_impl.h"

#import <UIKit/UIKit.h>

#import "base/strings/string_number_conversions.h"
#import "base/strings/string_split.h"
#import "services/network/public/cpp/shared_url_loader_factory.h"
#import "testing/gtest/include/gtest/gtest.h"
#import "testing/platform_test.h"
#import "ui/gfx/image/image_unittest_util.h"
#import "url/gurl.h"

namespace autofill {

class AutofillImageFetcherImplTest : public PlatformTest {
 public:
  AutofillImageFetcherImplTest()
      : autofill_image_fetcher_impl_(
            std::make_unique<AutofillImageFetcherImpl>(nullptr)) {}

  AutofillImageFetcherImpl* autofill_image_fetcher() {
    return autofill_image_fetcher_impl_.get();
  }

 private:
  std::unique_ptr<AutofillImageFetcherImpl> autofill_image_fetcher_impl_;
};

TEST_F(AutofillImageFetcherImplTest, ResolveCardArtURL) {
  // ResolveImageURL should append FIFE parameters, specifying an image that is
  // 40x24px scaled to the screen scale.
  autofill_image_fetcher()->SetScreenScaleForTesting(4);
  EXPECT_EQ(autofill_image_fetcher()->ResolveImageURL(
                GURL("https://www.example.com/fake_image1"),
                AutofillImageFetcherBase::ImageType::kCreditCardArtImage),
            GURL("https://www.example.com/fake_image1=w160-h96-s"));
}

TEST_F(AutofillImageFetcherImplTest, ResolveCardArtImage) {
  // On iOS, the underlying decoder for the image fetcher always decodes
  // into a scale=1 UIImage. ResolveImage for credit card images then re-scales
  // it to match the screen scale.
  //
  // For this test, we mimic this by creating a UIImage of scale 1 directly,
  // then making sure that ResolveImage re-scales it to the mocked screen scale
  // set on the AutofillImageFetcherImpl.
  UIImage* input_image = gfx::test::CreatePlatformImage();
  input_image = [UIImage imageWithCGImage:[input_image CGImage]
                                    scale:1
                              orientation:input_image.imageOrientation];
  ASSERT_EQ(input_image.scale, 1);

  autofill_image_fetcher()->SetScreenScaleForTesting(7);
  gfx::Image card_art_image = autofill_image_fetcher()->ResolveImage(
      GURL("https://example.com/fake_image1"), gfx::Image(input_image),
      AutofillImageFetcherBase::ImageType::kCreditCardArtImage);
  EXPECT_EQ(card_art_image.ToUIImage().scale, 7);
}

// Regression test for crbug.com/1484797, in which the server can return an
// empty image that caused `AutofillImageFetcherImpl::ResolveCardArtImage()` to
// crash.
TEST_F(AutofillImageFetcherImplTest, ResolveCardArtImage_EmptyImage) {
  gfx::Image resolved_image = autofill_image_fetcher()->ResolveImage(
      GURL("https://example.com/fake_image1"), gfx::Image(),
      AutofillImageFetcherBase::ImageType::kCreditCardArtImage);
  EXPECT_TRUE(resolved_image.IsEmpty());
}

}  // namespace autofill
