blob: 0007a294ec24207f5232628f0d6f6f4b33cdc5e6 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/quick_insert/quick_insert_insert_media.h"
#include <optional>
#include <string>
#include "ash/quick_insert/quick_insert_rich_media.h"
#include "ash/quick_insert/quick_insert_web_paste_target.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/functional/callback_helpers.h"
#include "base/test/task_environment.h"
#include "base/test/test_future.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/ime/fake_text_input_client.h"
namespace ash {
namespace {
class ScopedTestFile {
public:
bool Create(std::string_view file_name, std::string_view contents) {
if (!temp_dir_.CreateUniqueTempDir()) {
return false;
}
path_ = temp_dir_.GetPath().Append(file_name);
if (!base::WriteFile(path_, contents)) {
return false;
}
return true;
}
const base::FilePath& path() const { return path_; }
private:
base::ScopedTempDir temp_dir_;
base::FilePath path_;
};
struct TestCase {
// The media to insert.
QuickInsertRichMedia media_to_insert;
// The expected text in the input field if the insertion was successful.
std::u16string expected_text;
// The expected image in the input field if the insertion was successful.
std::optional<GURL> expected_image_url;
};
using QuickInsertInsertMediaTest = testing::TestWithParam<TestCase>;
TEST_P(QuickInsertInsertMediaTest, SupportsInsertingMedia) {
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = true});
EXPECT_TRUE(
InputFieldSupportsInsertingMedia(GetParam().media_to_insert, client));
}
TEST_P(QuickInsertInsertMediaTest, InsertsMediaWithNoError) {
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = true});
base::test::TestFuture<InsertMediaResult> future;
InsertMediaToInputField(GetParam().media_to_insert, client,
/*get_web_paste_target=*/{}, future.GetCallback());
EXPECT_EQ(future.Get(), InsertMediaResult::kSuccess);
EXPECT_EQ(client.text(), GetParam().expected_text);
EXPECT_EQ(client.last_inserted_image_url(), GetParam().expected_image_url);
}
INSTANTIATE_TEST_SUITE_P(
,
QuickInsertInsertMediaTest,
testing::Values(
TestCase{
.media_to_insert = QuickInsertTextMedia(u"hello"),
.expected_text = u"hello",
},
TestCase{
.media_to_insert =
QuickInsertImageMedia(GURL("http://foo.com/fake.jpg"),
gfx::Size(10, 10)),
.expected_image_url = GURL("http://foo.com/fake.jpg"),
},
TestCase{
.media_to_insert = QuickInsertLinkMedia(GURL("http://foo.com"),
"foo"),
.expected_text = u"http://foo.com/",
}));
TEST(QuickInsertInsertImageMediaTest, UnsupportedInputField) {
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = false});
EXPECT_FALSE(InputFieldSupportsInsertingMedia(
QuickInsertImageMedia(GURL("http://foo.com"), gfx::Size(10, 10)),
client));
}
TEST(QuickInsertInsertImageMediaTest,
InsertingUnsupportedInputFieldFailsAsynchronously) {
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = false});
base::test::TestFuture<InsertMediaResult> future;
InsertMediaToInputField(
QuickInsertImageMedia(GURL("http://foo.com"), gfx::Size(10, 10)), client,
/*get_web_paste_target=*/{}, future.GetCallback());
EXPECT_EQ(future.Get(), InsertMediaResult::kUnsupported);
EXPECT_EQ(client.last_inserted_image_url(), std::nullopt);
}
TEST(QuickInsertInsertLocalFileMediaTest, SupportedInputField) {
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = true});
EXPECT_TRUE(InputFieldSupportsInsertingMedia(
QuickInsertLocalFileMedia(base::FilePath("foo.txt")), client));
}
TEST(QuickInsertInsertLocalFileMediaTest, UnsupportedInputField) {
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = false});
EXPECT_FALSE(InputFieldSupportsInsertingMedia(
QuickInsertLocalFileMedia(base::FilePath("foo.txt")), client));
}
TEST(QuickInsertInsertLocalFileMediaTest, InsertsAsynchronously) {
base::test::TaskEnvironment task_environment;
ScopedTestFile file;
ASSERT_TRUE(file.Create("foo.png", "Test data"));
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = true});
base::test::TestFuture<InsertMediaResult> future;
InsertMediaToInputField(QuickInsertLocalFileMedia(file.path()), client,
/*get_web_paste_target=*/{}, future.GetCallback());
EXPECT_EQ(future.Get(), InsertMediaResult::kSuccess);
EXPECT_EQ(client.text(), u"");
EXPECT_EQ(client.last_inserted_image_url(),
GURL("data:image/png;base64,VGVzdCBkYXRh"));
}
TEST(QuickInsertInsertLocalFileMediaTest,
InsertingInUnsupportedClientReturnsError) {
base::test::TaskEnvironment task_environment;
ScopedTestFile file;
ASSERT_TRUE(file.Create("foo.png", "Test data"));
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = false});
base::test::TestFuture<InsertMediaResult> future;
InsertMediaToInputField(QuickInsertLocalFileMedia(file.path()), client,
/*get_web_paste_target=*/{}, future.GetCallback());
EXPECT_EQ(future.Get(), InsertMediaResult::kUnsupported);
EXPECT_EQ(client.text(), u"");
EXPECT_EQ(client.last_inserted_image_url(), std::nullopt);
}
TEST(QuickInsertInsertLocalFileMediaTest,
InsertingUnsupportedMediaTypeReturnsError) {
base::test::TaskEnvironment task_environment;
ScopedTestFile file;
ASSERT_TRUE(file.Create("foo.meow", "Test data"));
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = true});
base::test::TestFuture<InsertMediaResult> future;
InsertMediaToInputField(QuickInsertLocalFileMedia(file.path()), client,
/*get_web_paste_target=*/{}, future.GetCallback());
EXPECT_EQ(future.Get(), InsertMediaResult::kUnsupported);
EXPECT_EQ(client.text(), u"");
EXPECT_EQ(client.last_inserted_image_url(), std::nullopt);
}
TEST(QuickInsertInsertLocalFileMediaTest,
InsertingNonExistentFileReturnsError) {
base::test::TaskEnvironment task_environment;
ui::FakeTextInputClient client(
{.type = ui::TEXT_INPUT_TYPE_TEXT, .can_insert_image = true});
base::test::TestFuture<InsertMediaResult> future;
InsertMediaToInputField(QuickInsertLocalFileMedia(base::FilePath("foo.txt")),
client,
/*get_web_paste_target=*/{}, future.GetCallback());
EXPECT_EQ(future.Get(), InsertMediaResult::kNotFound);
EXPECT_EQ(client.text(), u"");
EXPECT_EQ(client.last_inserted_image_url(), std::nullopt);
}
} // namespace
} // namespace ash