#ifndef COMPONENTS_CONTEXTUAL_SEARCH_INTERNAL_TEST_COMPOSEBOX_QUERY_CONTROLLER_H_
#define COMPONENTS_CONTEXTUAL_SEARCH_INTERNAL_TEST_COMPOSEBOX_QUERY_CONTROLLER_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "components/contextual_search/internal/composebox_query_controller.h"
#include "components/variations/variations_client.h"
namespace base {
class TimeDelta;
}
class GURL;
namespace endpoint_fetcher {
class EndpointFetcher;
enum class HttpMethod;
struct EndpointResponse;
}
namespace lens {
class LensOverlayClientContext;
class LensOverlayServerClusterInfoResponse;
}
class FakeEndpointFetcher : public endpoint_fetcher::EndpointFetcher {
public:
explicit FakeEndpointFetcher(endpoint_fetcher::EndpointResponse response);
void PerformRequest(
endpoint_fetcher::EndpointFetcherCallback endpoint_fetcher_callback,
const char* key) override;
bool disable_responding_ = false;
private:
endpoint_fetcher::EndpointResponse response_;
};
class FakeVariationsClient : public variations::VariationsClient {
public:
~FakeVariationsClient() override = default;
bool IsOffTheRecord() const override;
variations::mojom::VariationsHeadersPtr GetVariationsHeaders() const override;
};
using EndpointFetcherCreatedCallback =
base::RepeatingCallback<void()>;
namespace contextual_search {
class TestComposeboxQueryController : public ComposeboxQueryController {
public:
explicit TestComposeboxQueryController(
signin::IdentityManager* identity_manager,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
version_info::Channel channel,
std::string locale,
TemplateURLService* template_url_service,
variations::VariationsClient* variations_client,
std::unique_ptr<ContextualSearchContextController::ConfigParams>
config_params,
bool enable_cluster_info_ttl);
~TestComposeboxQueryController() override;
void set_fake_cluster_info_response(
lens::LensOverlayServerClusterInfoResponse response) {
fake_cluster_info_response_ = response;
}
void set_fake_file_upload_response(lens::LensOverlayServerResponse response) {
fake_file_upload_response_ = response;
}
void set_fake_interaction_response(lens::LensOverlayServerResponse response) {
fake_interaction_response_ = response;
}
void set_next_cluster_info_request_should_return_error(
bool set_next_cluster_info_request_should_return_error) {
next_cluster_info_request_should_return_error_ =
set_next_cluster_info_request_should_return_error;
}
void set_next_file_upload_request_should_return_error(
bool set_next_file_upload_request_should_return_error) {
next_file_upload_request_should_return_error_ =
set_next_file_upload_request_should_return_error;
}
void set_enable_cluster_info_ttl(bool enable_cluster_info_ttl) {
enable_cluster_info_ttl_ = enable_cluster_info_ttl;
}
void set_on_query_controller_state_changed_callback(
base::RepeatingCallback<void(QueryControllerState state)> callback) {
on_query_controller_state_changed_callback_ = std::move(callback);
}
const int& num_cluster_info_fetch_requests_sent() const {
return num_cluster_info_fetch_requests_sent_;
}
const int& num_file_upload_requests_sent() const {
return num_file_upload_requests_sent_;
}
QueryControllerState query_controller_state() const {
return query_controller_state_;
}
const GURL& last_sent_fetch_url() const { return last_sent_fetch_url_; }
std::optional<lens::LensOverlayServerRequest> recent_sent_upload_request(
size_t index_from_end) const {
size_t index = sent_upload_requests_.size() - index_from_end - 1;
if (index < 0 || index >= sent_upload_requests_.size()) {
return std::nullopt;
}
return std::make_optional(sent_upload_requests_[index]);
}
std::optional<lens::LensOverlayServerRequest> recent_sent_interaction_request(
size_t index_from_end) const {
size_t index = sent_interaction_requests_.size() - index_from_end - 1;
if (index < 0 || index >= sent_interaction_requests_.size()) {
return std::nullopt;
}
return std::make_optional(sent_interaction_requests_[index]);
}
std::optional<lens::LensOverlayServerRequest> last_sent_file_upload_request()
const {
return recent_sent_upload_request(0);
}
std::optional<lens::LensOverlayServerRequest> last_sent_interaction_request()
const {
return recent_sent_interaction_request(0);
}
std::vector<std::string> last_sent_cors_exempt_headers() const {
return last_sent_cors_exempt_headers_;
}
lens::LensOverlayClientContext client_context() const {
return ComposeboxQueryController::CreateClientContext();
}
const ComposeboxQueryController::FileInfo* GetFileInfoForTesting(
const base::UnguessableToken& file_token) {
return static_cast<const ComposeboxQueryController::FileInfo*>(
ComposeboxQueryController::GetFileInfo(file_token));
}
void AddEndpointFetcherCreatedCallback(
EndpointFetcherCreatedCallback callback) {
on_endpoint_fetcher_created_callbacks_.push_back(std::move(callback));
}
protected:
std::unique_ptr<endpoint_fetcher::EndpointFetcher> CreateEndpointFetcher(
std::string request_string,
const GURL& fetch_url,
endpoint_fetcher::HttpMethod http_method,
base::TimeDelta timeout,
const std::vector<std::string>& request_headers,
const std::vector<std::string>& cors_exempt_headers,
UploadProgressCallback upload_progress_callback) override;
void ResetRequestClusterInfoState() override;
lens::LensOverlayServerClusterInfoResponse fake_cluster_info_response_;
lens::LensOverlayServerResponse fake_file_upload_response_;
lens::LensOverlayServerResponse fake_interaction_response_;
int num_cluster_info_fetch_requests_sent_ = 0;
int num_file_upload_requests_sent_ = 0;
bool next_cluster_info_request_should_return_error_ = false;
bool next_file_upload_request_should_return_error_ = false;
bool enable_cluster_info_ttl_;
GURL last_sent_fetch_url_;
std::vector<lens::LensOverlayServerRequest> sent_upload_requests_;
std::vector<lens::LensOverlayServerRequest> sent_interaction_requests_;
std::vector<EndpointFetcherCreatedCallback>
on_endpoint_fetcher_created_callbacks_;
std::vector<std::string> last_sent_cors_exempt_headers_;
};
}
#endif