google-ads-api
Version:
Google Ads API Client Library for Node.js
324 lines (323 loc) • 12 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mockStreamWithBadData = exports.mockStreamWithSummaryRow = exports.mockStream = exports.mockParsedValues = exports.mockParseValue = exports.mockErrorMessage = exports.mockError = exports.mockMutationReturnValue = exports.mockTotalResultsCount = exports.mockSummaryRow = exports.mockQueryReturnValueUnparsed = exports.mockQueryReturnValueWithSummaryRow = exports.mockQueryReturnValue = exports.mockSearchRawResultWithSummaryRow = exports.mockSearchRawResult = exports.mockMutations = exports.mockReportOptions = exports.mockGaqlQuery = exports.MOCK_LOGIN_CID = exports.MOCK_CID = exports.MOCK_REFRESH_TOKEN = exports.MOCK_DEVELOPER_TOKEN = exports.MOCK_CLIENT_SECRET = exports.MOCK_CLIENT_ID = void 0;
exports.mockGetAccessToken = mockGetAccessToken;
exports.mockPaginatedSearch = mockPaginatedSearch;
exports.mockSearchOnce = mockSearchOnce;
exports.mockBuildSearchStreamRequestAndService = mockBuildSearchStreamRequestAndService;
exports.mockBuildSearchRequestAndService = mockBuildSearchRequestAndService;
exports.mockBuildMutateRequestAndService = mockBuildMutateRequestAndService;
exports.mockGetGoogleAdsError = mockGetGoogleAdsError;
exports.mockQuery = mockQuery;
exports.mockParse = mockParse;
exports.mockParseRest = mockParseRest;
exports.noopParser = noopParser;
exports.mockMethod = mockMethod;
exports.failTestIfExecuted = failTestIfExecuted;
exports.newCustomer = newCustomer;
const stream_1 = require("stream");
const customer_1 = require("./customer");
const parser = __importStar(require("./parser"));
const parserRest = __importStar(require("./parserRest"));
const protos_1 = require("./protos");
const lodash_1 = __importDefault(require("lodash"));
exports.MOCK_CLIENT_ID = "MOCK CLIENT ID";
exports.MOCK_CLIENT_SECRET = "MOCK CLIENT SECRET";
exports.MOCK_DEVELOPER_TOKEN = "MOCK DEVELOPER TOKEN";
exports.MOCK_REFRESH_TOKEN = "MOCK REFRESH TOKEN";
exports.MOCK_CID = "MOCK CID";
exports.MOCK_LOGIN_CID = "MOCK LOGIN CID";
exports.mockGaqlQuery = `SELECT campaign.resource_name FROM campaign LIMIT 1`;
exports.mockReportOptions = {
entity: "campaign",
attributes: ["campaign.resource_name"],
limit: 1,
};
exports.mockMutations = [
{ resource: "abc", entity: "campaign", operation: "create" },
];
exports.mockSearchRawResult = [
{
totalResultsCount: 23,
results: [
{ campaign: { resourceName: "customers/1/campaigns/11" } },
{ campaign: { resourceName: "customers/2/campaigns/22" } },
{ campaign: { resourceName: "customers/3/campaigns/33" } },
],
},
];
exports.mockSearchRawResultWithSummaryRow = [
{
totalResultsCount: 23,
results: [
{ campaign: { resourceName: "customers/1/campaigns/11" } },
{ campaign: { resourceName: "customers/2/campaigns/22" } },
{ campaign: { resourceName: "customers/3/campaigns/33" } },
],
},
{
summaryRow: { metrics: { clicks: 90, impressions: 153 } },
},
];
exports.mockQueryReturnValue = [
{ campaign: { resource_name: "customers/1/campaigns/11" } },
{ campaign: { resource_name: "customers/2/campaigns/22" } },
{ campaign: { resource_name: "customers/3/campaigns/33" } },
];
exports.mockQueryReturnValueWithSummaryRow = [
{ campaign: { resource_name: "customers/1/campaigns/11" } },
{ campaign: { resource_name: "customers/2/campaigns/22" } },
{ campaign: { resource_name: "customers/3/campaigns/33" } },
{ metrics: { clicks: 90, impressions: 153 } },
];
exports.mockQueryReturnValueUnparsed = [
{ campaign: { resourceName: "customers/1/campaigns/11" } },
{ campaign: { resourceName: "customers/2/campaigns/22" } },
{ campaign: { resourceName: "customers/3/campaigns/33" } },
];
exports.mockSummaryRow = {
metrics: { clicks: 90, impressions: 153 },
};
exports.mockTotalResultsCount = 23;
exports.mockMutationReturnValue = {
mutate_operation_responses: [],
toJSON: () => {
return {};
},
};
exports.mockError = {
errors: [
{
errorCode: {
queryError: protos_1.errors.QueryErrorEnum.QueryError.BAD_RESOURCE_TYPE_IN_FROM_CLAUSE,
},
message: "Error in campaigns: is not a valid resource name.",
},
],
};
exports.mockErrorMessage = "mock error message";
exports.mockParseValue = "mock parse value";
exports.mockParsedValues = [
exports.mockParseValue,
exports.mockParseValue,
exports.mockParseValue,
];
// Returns a stream that emits the provided values
const mockStream = function (data = exports.mockSearchRawResult) {
const chunks = lodash_1.default.chunk(JSON.stringify(data), 10).map((c) => c.join("")); // random splits
const stream = new stream_1.Readable({ objectMode: true });
chunks.forEach((value) => stream.push(new Buffer(value)));
stream.push(null);
return stream;
};
exports.mockStream = mockStream;
function mockGetAccessToken(customer) {
return (jest
.spyOn(customer, "getAccessToken")
// ts-expect-error
.mockImplementation(async () => {
return "mockedAccessTokenHere";
}));
}
const mockStreamWithSummaryRow = function () {
return (0, exports.mockStream)(exports.mockSearchRawResultWithSummaryRow);
};
exports.mockStreamWithSummaryRow = mockStreamWithSummaryRow;
const mockStreamWithBadData = function () {
return (0, exports.mockStream)({ results: 66 });
};
exports.mockStreamWithBadData = mockStreamWithBadData;
function mockPaginatedSearch(customer, includeTotalResultsCount = false) {
return (jest
// @ts-expect-error private method
.spyOn(customer, "paginatedSearch")
// @ts-expect-error
.mockImplementation((gaqlQuery, requestOptions) => {
const totalResultsCount = includeTotalResultsCount
? exports.mockTotalResultsCount
: undefined;
return {
response: exports.mockQueryReturnValue,
totalResultsCount,
};
}));
}
function mockSearchOnce({ customer, response, nextPageToken, includeTotalResultsCount, }) {
return (jest
// @ts-expect-error private method
.spyOn(customer, "search")
// @ts-expect-error
.mockImplementationOnce(() => {
return {
response,
nextPageToken,
totalResultsCount: includeTotalResultsCount
? exports.mockTotalResultsCount
: undefined,
};
}));
}
function mockBuildSearchStreamRequestAndService(customer) {
const mockStream = new stream_1.Readable({ objectMode: true });
const mockStreamData = (results) => {
const chunk = { results };
mockStream.push(chunk);
};
const mockStreamSummaryRow = () => {
const chunk = {
summary_row: exports.mockSummaryRow,
};
mockStream.push(chunk);
};
const mockStreamError = (error) => {
mockStream.destroy(error);
};
const mockStreamEnd = () => {
mockStream.push(null);
};
const spyBuild = jest
// @ts-expect-error protected method
.spyOn(customer, "buildSearchStreamRequestAndService")
// @ts-expect-error
.mockImplementation(() => {
return {
service: {
searchStream: () => mockStream,
},
request: {},
};
});
return {
spyBuild,
mockStreamData,
mockStreamSummaryRow,
mockStreamError,
mockStreamEnd,
};
}
function mockBuildSearchRequestAndService({ customer, shouldThrow = false, includeSummaryRow = false, includeTotalResultsCount = false, }) {
const mockService = {
search: () => {
if (shouldThrow) {
throw new Error(exports.mockErrorMessage);
}
const searchGoogleAdsResponse = {
summary_row: includeSummaryRow ? exports.mockSummaryRow : undefined,
total_results_count: includeTotalResultsCount
? exports.mockTotalResultsCount
: undefined,
};
return [exports.mockQueryReturnValue, null, searchGoogleAdsResponse];
},
};
const spyBuild = jest
// @ts-expect-error protected method
.spyOn(customer, "buildSearchRequestAndService")
// @ts-expect-error
.mockImplementation(() => {
return {
service: mockService,
request: {},
};
});
return { mockService, spyBuild };
}
function mockBuildMutateRequestAndService({ customer, shouldThrow = false, request, response, }) {
const mockService = {
mutate() {
if (shouldThrow) {
throw new Error(exports.mockErrorMessage);
}
return [response ?? exports.mockMutationReturnValue];
},
};
const spyBuild = jest
// @ts-expect-error protected method
.spyOn(customer, "buildMutationRequestAndService")
// @ts-expect-error
.mockImplementation(() => {
return {
service: mockService,
request: request ?? {},
};
});
return { mockService, spyBuild };
}
function mockGetGoogleAdsError(customer) {
return (jest
// @ts-expect-error protected method
.spyOn(customer, "getGoogleAdsError")
// @ts-expect-error
.mockImplementation(() => exports.mockError));
}
function mockQuery(customer) {
return (jest
// @ts-expect-error private method
.spyOn(customer, "querier")
// @ts-expect-error
.mockImplementation(() => {
return {
response: exports.mockQueryReturnValue,
totalResultsCount: exports.mockTotalResultsCount,
};
}));
}
function mockParse(mockParsedValues) {
return jest.spyOn(parser, "parse").mockImplementation(() => mockParsedValues);
}
function mockParseRest(mockParsedValues) {
return jest
.spyOn(parserRest, "decamelizeKeys")
.mockImplementation(() => mockParsedValues);
}
function noopParser(rows) {
return rows;
}
function mockMethod() {
return {
method() {
return;
},
};
}
function failTestIfExecuted() {
expect(true).toBeFalsy();
}
function newCustomer(hooks, disableParsing = false) {
return new customer_1.Customer({
client_id: exports.MOCK_CLIENT_ID,
client_secret: exports.MOCK_CLIENT_SECRET,
developer_token: exports.MOCK_DEVELOPER_TOKEN,
disable_parsing: disableParsing,
}, {
refresh_token: exports.MOCK_REFRESH_TOKEN,
customer_id: exports.MOCK_CID,
login_customer_id: exports.MOCK_LOGIN_CID,
}, hooks);
}