blob: 14360819297a1664a42a737728400e86b77f7a74 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "build/build_config.h"
#if !BUILDFLAG(IS_ANDROID)
#include "base/functional/callback.h"
#include "base/test/test_future.h"
#include "chrome/browser/accessibility_annotator/accessibility_query_service_delegate_impl.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/page_content_annotations/content/mock_page_content_services.h"
#include "components/passage_embeddings/core/passage_embeddings_test_util.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/page_transition_types.h"
namespace accessibility_annotator {
using ::page_content_annotations::CreateExtractionResult;
using ::page_content_annotations::CreatePassageEmbeddings;
using ::page_content_annotations::MockPageContentExtractionService;
using ::page_content_annotations::MockPageEmbeddingsService;
using ::testing::NiceMock;
using ::testing::Return;
using ::testing::UnorderedElementsAre;
class AccessibilityQueryServiceDelegateImplBrowserTest
: public InProcessBrowserTest {
public:
AccessibilityQueryServiceDelegateImplBrowserTest() = default;
~AccessibilityQueryServiceDelegateImplBrowserTest() override = default;
};
// RetrieveLiveTabContext returns an empty response when dependencies missing.
IN_PROC_BROWSER_TEST_F(AccessibilityQueryServiceDelegateImplBrowserTest,
RetrieveLiveTabContext_MissingDependencies) {
AccessibilityQueryServiceDelegateImpl delegate(browser()->profile());
LiveTabContextQuery query;
query.query = u"test query";
base::test::TestFuture<LiveTabContextResponse> future;
delegate.RetrieveLiveTabContext(query, future.GetCallback());
LiveTabContextResponse response = future.Take();
EXPECT_TRUE(response.results.empty());
}
// RetrieveLiveTabContext returns valid response when dependencies available.
IN_PROC_BROWSER_TEST_F(AccessibilityQueryServiceDelegateImplBrowserTest,
RetrieveLiveTabContext_Success) {
// Setup mock services.
Profile* profile = browser()->profile();
NiceMock<MockPageContentExtractionService> mock_extraction_service;
NiceMock<MockPageEmbeddingsService> mock_embeddings_service(
&mock_extraction_service);
passage_embeddings::TestEmbedder test_embedder;
EXPECT_CALL(mock_extraction_service,
GetExtractedPageContentAndEligibilityForPage)
.WillOnce(Return(CreateExtractionResult("passage 1", true)))
.WillOnce(Return(CreateExtractionResult("passage 2", true)))
.WillOnce(Return(CreateExtractionResult("passage 3", true)));
EXPECT_CALL(mock_embeddings_service, GetEmbeddings)
.WillOnce(Return(CreatePassageEmbeddings("passage 1")))
.WillOnce(Return(CreatePassageEmbeddings("passage 2")))
.WillOnce(Return(CreatePassageEmbeddings("passage 3")));
AccessibilityQueryServiceDelegateImpl delegate(
profile, &mock_extraction_service, &mock_embeddings_service,
&test_embedder);
// Create 3 tabs.
// The browser starts with 1 tab by default. We add 2 more.
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
for (int i = 0; i < 2; ++i) {
content::WebContents* web_contents = chrome::AddSelectedTabWithURL(
browser(), GURL("about:blank"), ui::PAGE_TRANSITION_LINK);
content::WaitForLoadStop(web_contents);
}
EXPECT_EQ(browser()->tab_strip_model()->count(), 3);
LiveTabContextQuery query;
query.query = u"test query";
base::test::TestFuture<LiveTabContextResponse> future;
delegate.RetrieveLiveTabContext(query, future.GetCallback());
LiveTabContextResponse response = future.Take();
// We expect 3 results (1 from each tab).
EXPECT_THAT(response.results,
UnorderedElementsAre(u"passage 1", u"passage 2", u"passage 3"));
}
} // namespace accessibility_annotator
#endif // !BUILDFLAG(IS_ANDROID)