Статус заказа WooCommerce не обновляется через API в тестировании автоматизации, но работает вручнуюJavascript

Форум по Javascript
Ответить
Anonymous
 Статус заказа WooCommerce не обновляется через API в тестировании автоматизации, но работает вручную

Сообщение Anonymous »

У нас есть плагин под названием Flexorder, основная функция которого состоит в том, чтобы синхронизировать заказы Woocommerce с Google Sheets и получить доступ к ним там. Одним из его ключевых функций является обновление статуса заказа, выбрав опцию выпадения в столбце статуса заказа в Google Sheets, и обновленное состояние затем отражается в соответствующем статусе заказа в Woocommerce. < /P>
Я провожу тестирование автоматизации для нашего плагина, используя драматург и JavaScript. Тем не менее, я сталкиваюсь с проблемой при разработке сценария автоматизации для тестового примера. Google Sheets API, я обновлю опцию раскрывающегося списка в столбце состояния заказа, а затем проверю статус заказа, используя API WooCommerce, чтобы убедиться, что статус заказа правильно обновлен в WooCommerce.

, где я сталкиваюсь с проблемой: < /h3>

[*] В первом тестовом примере: Статус заказа в Google Sheets успешно обновленный. Woocommerce.

Проверка вручную, функция работает правильно, но она проходит в тестировании автоматизации.

< /ul>
Сообщения об ошибках: < /h3>
Error: expect(received).toBe(expected) // Object.is equality

Expected: "wc-processing"
Received: "failed"

32 | const wooOrder = await statusUpdater.fetchOrderFromWooCommerce(storedOrder.id);
33 | expect(wooOrder.id).toBe(Number(storedOrder.id));
> 34 | expect(wooOrder.status).toBe(storedOrder.status);
< /code>
const { google } = require('googleapis');
const WooCommerceRestApi = require("@woocommerce/woocommerce-rest-api").default;

const updatedOrders = [];
const orderStatuses = ["wc-pending", "wc-processing", "wc-on-hold", "wc-completed", "wc-cancelled", "wc-refunded", "wc-failed", "wc-checkout-draft"];

class OrderStatusUpdater {
constructor(authConfigPath) {
this.authConfigPath = authConfigPath;
this.api = new WooCommerceRestApi({
url: process.env.SITE_URL,
consumerKey: process.env.WOOCOMMERCE_CONSUMER_KEY,
consumerSecret: process.env.WOOCOMMERCE_CONSUMER_SECRET,
version: 'wc/v3'
});
}

async getAccessToken() {
const auth = new google.auth.GoogleAuth({
keyFile: this.authConfigPath,
scopes: ['https://www.googleapis.com/auth/spreadsheets'],
});
const authClient = await auth.getClient();
const accessToken = await authClient.getAccessToken();
return accessToken.token;
}

async fetchFirstOrder(range) {
const accessToken = await this.getAccessToken();
const sheets = google.sheets({ version: 'v4', auth: this.auth });
const response = await sheets.spreadsheets.values.get({
spreadsheetId: process.env.GOOGLE_SHEET_ID,
range,
headers: {
Authorization: `Bearer ${accessToken}`,
},
});

return response.data.values ? response.data.values[0] : null;
}

async updateOrderStatusInSheet(orderId, newStatus) {
if (!orderStatuses.includes(newStatus)) {
throw new Error(`Invalid status: ${newStatus}`);
}

const accessToken = await this.getAccessToken();
const sheets = google.sheets({ version: 'v4', auth: this.auth });
const range = `Orders!C2`;

await sheets.spreadsheets.values.update({
spreadsheetId: process.env.GOOGLE_SHEET_ID,
range,
valueInputOption: 'USER_ENTERED',
resource: {
values: [[newStatus]]
},
headers: {
Authorization: `Bearer ${accessToken}`,
},
});

updatedOrders.push({ id: orderId, status: newStatus });
console.log(`Order ID ${orderId} status updated to "${newStatus}" in Google Sheets`);
}

async updateDropdownOptions(sheetId) {
try {
const sheets = google.sheets({ version: 'v4', auth: await this.auth.getClient() });

const dataValidationRule = {
requests: [
{
setDataValidation: {
range: {
sheetId: sheetId, // Sheet ID (not spreadsheet ID)
startRowIndex: 1, // Row where dropdown should start
startColumnIndex: 2, // Column where dropdown should be applied
endColumnIndex: 3
},
rule: {
condition: {
type: 'ONE_OF_LIST',
values: orderStatuses.map(status => ({ userEnteredValue: status }))
},
strict: true,
showCustomUi: true
}
}
}
]
};

const response = await sheets.spreadsheets.batchUpdate({
spreadsheetId: process.env.GOOGLE_SHEET_ID,
resource: dataValidationRule
});

console.log('Dropdown options updated in Google Sheets:', response.data);
} catch (error) {
console.error('Error updating dropdown options:', error.message);
}
}

async fetchOrderFromWooCommerce(orderId) {
try {
const response = await this.api.get(`orders/${orderId}`);
return response.data;
} catch (error) {
console.error('Error fetching order from WooCommerce:', error.response?.data || error.message);
throw error;
}
}

getRandomStatus() {
return orderStatuses[Math.floor(Math.random() * orderStatuses.length)];
}
}

module.exports = {
OrderStatusUpdater,
updatedOrders
};
< /code>
const { test, expect } = require('@playwright/test');
const { OrderStatusUpdater, updatedOrders } = require('../../test-utils/updateOrderStatus');

test.describe('Google Sheets to WooCommerce Order Status Sync', () => {
let statusUpdater;

test.beforeAll(() => {
statusUpdater = new OrderStatusUpdater('./tests/utilities/upload_key.json');
});

test('Update order status in Google Sheets', async ({ page }) => {
const firstOrder = await statusUpdater.fetchFirstOrder('Orders!A2:Z2');
const [orderId, , currentStatus] = firstOrder;
console.log(`Current Status of Order ID ${orderId}: ${currentStatus}`);

const newStatus = statusUpdater.getRandomStatus();
await statusUpdater.updateOrderStatusInSheet(orderId, newStatus);
await page.waitForTimeout(20000);
const storedOrder = updatedOrders.find(order => order.id === orderId);
expect(storedOrder).toBeDefined();
expect(storedOrder.status).toBe(newStatus);

console.log('Updated Orders Array:', updatedOrders);
});

test('Validate updated order status in WooCommerce', async () => {
const storedOrder = updatedOrders[0];
expect(storedOrder).toBeDefined();

const wooOrder = await statusUpdater.fetchOrderFromWooCommerce(storedOrder.id);
expect(wooOrder.id).toBe(Number(storedOrder.id));
expect(wooOrder.status).toBe(storedOrder.status);

console.log(`Order ID ${storedOrder.id} status in WooCommerce: ${wooOrder.status}`);
});
});


Подробнее здесь: https://stackoverflow.com/questions/794 ... ut-works-m
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»