UNPKG

google-ads-api

Version:

Google Ads API Client Library for Node.js

324 lines (323 loc) 12 kB
"use strict"; 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); }