|
import { test, expect } from '@playwright/test';
|
|
const { chromium } = require('playwright');
|
|
import { OrderDetails } from '../../OBAPages/Orderapipage.spec';
|
|
import { Appconfig } from '../../OBAPages/AppConfig.spec';
|
|
const FormData =require('form-data');
|
|
|
|
|
|
//order sync to get order details using userid and user phone number and mercchant id.
|
|
test ('OrderSync of completed orders',async({request,page})=>{
|
|
const response = await request.get('https://dev.orderbookings.com/api/order/syncOrders?user_id=670766e4272db54e96e423e0&phone=919480111222&lastupdatetime=0&merchantCode=919480707707&role=ROLE_TYPE_USER')
|
|
const res=await response.json();
|
|
|
|
let OrderedBy = res.data[0].ordered_by_name; //you will get user from this.
|
|
let Orderstatus = res.data[0].order_status; //order status i will get from response
|
|
|
|
const orderdetail = new OrderDetails(page);
|
|
await orderdetail.navigateToOrderDetails();
|
|
|
|
const result= await orderdetail.searchOrder(Orderstatus,OrderedBy);
|
|
|
|
const username = result.OrderId;
|
|
const userid =result.OrderId;
|
|
const useremail = result.OrderId;
|
|
const userphone = result.OrderId;
|
|
const userorderitems = result.Order_items;
|
|
const userorderstatus = result.OrderStatusis;
|
|
let ordercost = result.Order_cost;
|
|
let orderqty = result.Order_qty;
|
|
|
|
expect.soft(userid).toContain(res.data[0].id); //id
|
|
expect.soft(username).toContain(res.data[0].ordered_by_name); //name
|
|
expect.soft(useremail).toContain(res.data[0].ordered_by_email); //email
|
|
expect.soft(userphone).toContain(res.data[0].ordered_by_phone); //phone
|
|
expect.soft(userorderitems).toContain((res.data[0].ordered_items[0]).toString()); //order items
|
|
expect.soft(ordercost).toContain((res.data[0].order_cost).toString()); //order cost
|
|
expect.soft(orderqty).toContain((res.data[0].ordered_items_qty[0]).toString()); // order qty
|
|
expect.soft(userorderstatus).toContain(res.data[0].order_status); // order status is complete
|
|
await page.close();
|
|
})
|
|
//C:\PlayWright\tests\navigatetomen.spec.js
|
|
|
|
|
|
|
|
//unable to automate becasue its contains bug in the orderitems,order qty,order item price.
|
|
//locator finds two locators when we run the automated testcode.
|
|
test.skip('OrderSync for Pending ',async({request,page})=>{
|
|
const response = await request.get('https://dev.orderbookings.com/api/order/syncOrders?user_id=670766e4272db54e96e423e0&phone=919480111222&lastupdatetime=0&merchantCode=919480707707&role=ROLE_TYPE_USER')
|
|
const res=await response.json();
|
|
|
|
const orderdetail = new OrderDetails(page);
|
|
await orderdetail.navigateToOrderDetails();
|
|
const result= await orderdetail.searchOrder('ORDER_STATUS_CANCELLED','Shubya');
|
|
|
|
const username = result.OrderId;
|
|
const userid =result.OrderId;
|
|
const useremail = result.OrderId;
|
|
const userphone = result.OrderId;
|
|
const userorderitems = result.Order_items;
|
|
const userorderstatus = result.OrderStatusis;
|
|
let ordercost = result.Order_cost;
|
|
let orderqty = result.Order_qty;
|
|
|
|
expect.soft(userid).toContain(res.data[1].id); //id
|
|
expect.soft(username).toContain(res.data[1].ordered_by_name); //name
|
|
expect.soft(useremail).toContain(res.data[1].ordered_by_email); //email
|
|
expect.soft(userphone).toContain(res.data[1].ordered_by_phone); //phone
|
|
expect.soft(userorderitems).toContain((res.data[1].ordered_items[1]).toString()); //order items
|
|
expect.soft(ordercost).toContain((res.data[1].order_cost).toString()); //order cost
|
|
expect.soft(orderqty).toContain((res.data[1].ordered_items_qty[1]).toString()); // order qty
|
|
expect.soft(userorderstatus).toContain(res.data[1].order_status); // order status is complete
|
|
await page.close();
|
|
|
|
})
|
|
|
|
test('GetUserDetails',async({request,page})=>{
|
|
const response = await request.get('https://dev.orderbookings.com/api/user/userreg?phone=919480111222&merchantCode=919480707707')
|
|
const res=await response.json();
|
|
|
|
const orderdetail = new OrderDetails(page);
|
|
await orderdetail.navigateTouser();
|
|
const result = await orderdetail.searchUserDetails('Shubya');
|
|
const userDetails = result.userDetails;
|
|
const merchantid = result.merchantid;
|
|
const userstatus = result.isActive;
|
|
expect.soft(userDetails).toContain(res.data.name);
|
|
expect.soft(userDetails).toContain(res.data.email);
|
|
expect.soft(userDetails).toContain(res.data.phone);
|
|
expect.soft(merchantid).toContain(res.data.merchantCode);
|
|
expect.soft(userDetails).toContain(res.data.area[0]);
|
|
expect.soft(userDetails).toContain(res.data.multiple_address_list[0].addressLine1);
|
|
expect.soft((userstatus).toString()).toContain((res.data.is_user_active).toString());
|
|
await page.close();
|
|
})
|
|
|
|
let useraddressid; // USER ADDRESS ID
|
|
test('Get Delete Post Patch Address of User',async({request,page})=>{
|
|
|
|
const response = await request.get('https://dev.orderbookings.com/api/user/addresslist?user_id=670766e4272db54e96e423e0')
|
|
const res=await response.json();
|
|
await console.log('GET ADDRESS OF USER');
|
|
await console.log(res);
|
|
|
|
const userdetail = new OrderDetails(page);
|
|
await userdetail.navigateTouser();
|
|
const result = await userdetail.updateUserAddress('Shubya');
|
|
|
|
await page.reload();
|
|
const user_Address_updated = result.user_Address_updated;
|
|
const user_area_updated =result.user_area_updated;
|
|
|
|
expect.soft(user_Address_updated).toContain((res.data[0].addressLine1).toString());
|
|
expect.soft(user_Address_updated).toContain((res.data[0].addressLine2).toString());
|
|
expect.soft(user_Address_updated).toContain((res.data[0].postalCode).toString());
|
|
expect.soft(user_area_updated).toContain(res.data[0].area);
|
|
|
|
const responseofdelete = await request.delete('https://dev.orderbookings.com/api/user/deleteaddress', {
|
|
data: {
|
|
"user_id": "670766e4272db54e96e423e0",
|
|
"address_id": "67076a2d272db54e96e423e8"
|
|
}
|
|
})
|
|
await console.log('DELETE ADDRESS OF USER');
|
|
await console.log(responseofdelete.json);
|
|
|
|
const response1 = await request.post('https://dev.orderbookings.com/api/user/addnewaddress', {
|
|
data: {
|
|
"addressLine1": "Adding address through the code1",
|
|
"addressLine2": "api is my home",
|
|
"city": "",
|
|
"stateOrProvince": "",
|
|
"postalCode": "123456",
|
|
"phone": "917777777777",
|
|
"deliveryInstructions": null,
|
|
"isDefault": true,
|
|
"user_id": "670766e4272db54e96e423e0",
|
|
"title": "Api test address1",
|
|
"area": "Mumbai"
|
|
}
|
|
})
|
|
const res1 = await response1.json();
|
|
useraddressid = res1.data.id;
|
|
await console.log(useraddressid);
|
|
await console.log('ADDED NEW ADDRESS OF USER');
|
|
await console.log(res1);
|
|
|
|
await page.reload();
|
|
|
|
const result1 = await userdetail.updateUserAddress('Shubya');
|
|
const user_Address_updated1 = result1.user_Address_updated;
|
|
const user_area_updated1 =result1.user_area_updated;
|
|
expect.soft(user_Address_updated1).toContain(res1.data.addressLine1);
|
|
expect.soft(user_Address_updated1).toContain((res1.data.addressLine2).toString());
|
|
expect.soft(user_Address_updated1).toContain((res1.data.postalCode).toString());
|
|
expect.soft(user_area_updated1).toContain(res1.data.area);
|
|
|
|
const response2 = await request.patch('https://dev.orderbookings.com/api/user/updateaddress', {
|
|
data: {
|
|
"addressLine1": "Update address through api request from code",
|
|
"addressLine2": "api",
|
|
"city": "Bijapur",
|
|
"stateOrProvince": "Goa",
|
|
"postalCode": "555555",
|
|
"phone": "919999999999",
|
|
"deliveryInstructions": null,
|
|
"isDefault": true,
|
|
"title": "test thought patch method address",
|
|
"area": "Mumbai",
|
|
"address_id": useraddressid
|
|
}
|
|
})
|
|
const res2 = await response2.json();
|
|
await console.log('UPDATED ADDRESS OF USER');
|
|
await console.log(res2);
|
|
|
|
const result2 = await userdetail.updateUserAddress('Shubya');
|
|
const user_Address_updated2 = result2.user_Address_updated;
|
|
const user_area_updated2 =result2.user_area_updated;
|
|
|
|
//await page.reload();
|
|
|
|
expect.soft(user_Address_updated2).toContain((res2.data.addressLine1).toString());
|
|
expect.soft(user_Address_updated2).toContain((res2.data.addressLine2).toString());
|
|
expect.soft(user_Address_updated2).toContain((res2.data.postalCode).toString());
|
|
expect.soft(user_area_updated2).toContain(res1.data.area);
|
|
await page.close();
|
|
})
|
|
|
|
|
|
|
|
//get order by order id and compare with web ui in the order list.
|
|
test('GET ORDER BY ORDER_ID',async ({request,page})=>{
|
|
|
|
let Orderstatus;
|
|
let OrderedBy;
|
|
|
|
const response1 = await request.get('https://dev.orderbookings.com/api/order/getorder/67076a2f272db54e96e423e9', {
|
|
data: {
|
|
"order_id": "6710b588b03c253fa86cf9cb",
|
|
"note": "note added again"
|
|
}
|
|
})
|
|
const res = await response1.json();
|
|
OrderedBy = res.data.ordered_by_name;
|
|
Orderstatus = res.data.order_status;
|
|
|
|
const orderdetail = new OrderDetails(page);
|
|
await orderdetail.navigateToOrderDetails();
|
|
|
|
const result= await orderdetail.searchOrder(Orderstatus,OrderedBy);
|
|
|
|
const username = result.OrderId;
|
|
const userid =result.OrderId;
|
|
const useremail = result.OrderId;
|
|
const userphone = result.OrderId;
|
|
const userorderitems = result.Order_items;
|
|
const userorderstatus = result.OrderStatusis;
|
|
let ordercost = result.Order_cost;
|
|
let orderqty = result.Order_qty;
|
|
|
|
expect.soft(userid).toContain(res.data.id); //id
|
|
expect.soft(username).toContain(res.data.ordered_by_name); //name
|
|
expect.soft(useremail).toContain(res.data.ordered_by_email); //email
|
|
expect.soft(userphone).toContain(res.data.ordered_by_phone); //phone
|
|
expect.soft(userorderitems).toContain((res.data.ordered_items[0]).toString()); //order items
|
|
expect.soft(ordercost).toContain((res.data.order_cost).toString()); //order cost
|
|
expect.soft(orderqty).toContain((res.data.ordered_items_qty[0]).toString()); // order qty
|
|
expect.soft(userorderstatus).toContain(res.data.order_status); // order status is complete
|
|
await page.close();
|
|
|
|
})
|
|
|
|
//app configuration details are compared with api response.
|
|
test('GET APP Config Details',async ({request,page})=>{
|
|
const response = await request.get('https://dev.orderbookings.com/api/config/919480707707?merchantCode=919480707707')
|
|
const res = await response.json();
|
|
|
|
const orderdetail = new OrderDetails(page);
|
|
await orderdetail.NavigatetoAppconfig();
|
|
await page.reload();
|
|
const appconfig = new Appconfig(page);
|
|
const app = await appconfig.GetAppConfigDetailsforApiRequest(); ////Currency,soundloop,canceltime,mincartvalue,deliletycharge,Actioncall,selecttype,Area
|
|
let currency = app.selectedCurrency;
|
|
let soundloop = app.soundloop;
|
|
let canceltime = app.canceltime;
|
|
let mincartvalue = app.mincartvalue;
|
|
let delivarycharge = app.delivarycharge;
|
|
let actioncall = app.Actioncall;
|
|
let selecttype = app.selectedtype;
|
|
let area = app.Area;
|
|
let MerachantCode = app.Merchantcode;
|
|
let profileDetails = app.ProfileDetails;
|
|
expect.soft(currency).toContain(res.data.currency_code); //currency
|
|
expect.soft(soundloop).toContain((res.data.notification_sound_loop).toString()); //soundloop
|
|
expect.soft(canceltime).toContain((res.data.cancellation_till).toString()); //canceltime
|
|
expect.soft(mincartvalue).toContain((res.data.minimum_cart_price).toString()); //mincartvalue
|
|
expect.soft(delivarycharge).toContain((res.data.delivery_charge).toString()); //delivarycharge
|
|
expect.soft(actioncall).toContain(res.data.call_to_action); //actioncall
|
|
expect.soft(selecttype).toContain(res.data.area_type);
|
|
expect.soft(MerachantCode).toContain(res.data.merchantCode); //merchant code
|
|
expect.soft(profileDetails).toContain(res.data.merchant_details.name); //Company Name
|
|
expect.soft(profileDetails).toContain(res.data.merchant_details.email); //Merchant Email
|
|
await page.close();
|
|
//expect.soft(area).toContain(res.data.area); //area
|
|
})
|
|
|
|
|
|
|
|
//unable to automate bcoz of the formdata cant be sent properly and unable to handle table data to comparre with response.
|
|
//place order -- complete order
|
|
//place order --- cancel order
|
|
//Place order using api request
|
|
let Orderstatus;
|
|
let OrderedBy;
|
|
let OrderId;
|
|
test('Place Order', async ({ request, page }) => {
|
|
|
|
const formData = new FormData();
|
|
const jsondata = {
|
|
"order_id": "",
|
|
"amount_received": 0,
|
|
"order_status": "ORDER_STATUS_PENDING",
|
|
"ordered_by_phone": "919480111222",
|
|
"ordered_by_user_id": "670766e4272db54e96e423e0",
|
|
"order_cost": 748,
|
|
"order_tax": 748,
|
|
"order_gross_amount": 1496,
|
|
"ordered_items": [
|
|
"Jeans Pant",
|
|
"T-Shirt"
|
|
],
|
|
"ordered_items_sku": [
|
|
"jeans_pant",
|
|
"t-shirt_"
|
|
],
|
|
"ordered_items_qty": [
|
|
1,
|
|
2
|
|
],
|
|
"ordered_items_tax": [
|
|
4,
|
|
9
|
|
],
|
|
"ordered_items_price": [
|
|
0,
|
|
0
|
|
],
|
|
"merchantCode": "919480707707",
|
|
"order_validation_pin": 254034,
|
|
"note": "",
|
|
"ordered_items_notes": [],
|
|
"images_arraylist": [],
|
|
"image_latitude": 0,
|
|
"image_longitude": 0,
|
|
"use_amount_from_wallet": false,
|
|
"service_request_date": 1729137865273,
|
|
"order_rating": 0,
|
|
"order_is_approved": true,
|
|
"ordered_items_audio": [],
|
|
"logs": [],
|
|
"ordered_by_name": "Shubya",
|
|
"ordered_by_email": "Shubya111@gmail.com",
|
|
"ordered_by_area": [
|
|
"Mumbai"
|
|
],
|
|
"order_time": "40860000",
|
|
"order_last_updated_on": "",
|
|
"order_complete_time": "",
|
|
"order_cancel_time": "",
|
|
"order_assigned_to": "",
|
|
"ordered_delivered_by": "",
|
|
"order_payment_received": false,
|
|
"order_has_audio_file": false,
|
|
"order_has_admin_audio_file": false,
|
|
"order_has_image_file": false,
|
|
"ordered_by_address": "67079c7b272db54e96e423f4",
|
|
"invoiceid": "",
|
|
"amount_from_wallet": 0,
|
|
"coupon": "",
|
|
"cart": [
|
|
{
|
|
"id": "670767d0272db54e96e423e4",
|
|
"available": true,
|
|
"sku": "jeans_pant",
|
|
"name": "Jeans Pant",
|
|
"description": "M.S.Dhoni Special Edition Jeans Pant.",
|
|
"quantity": 1,
|
|
"price": 300,
|
|
"image": "",
|
|
"tax_in_percent": 4,
|
|
"total": 312,
|
|
"actual": 312,
|
|
"order_limit": 100,
|
|
"short_description": "M.S.Dhoni Special Edition Jeans Pant.",
|
|
"is_live": true
|
|
},
|
|
{
|
|
"id": "67076794272db54e96e423e3",
|
|
"available": true,
|
|
"sku": "t-shirt_",
|
|
"name": "T-Shirt",
|
|
"description": "M.S.Dhoni Special Edition T-Shirts.",
|
|
"quantity": 2,
|
|
"price": 200,
|
|
"image": "",
|
|
"tax_in_percent": 9,
|
|
"total": 436,
|
|
"actual": 218,
|
|
"order_limit": 100,
|
|
"short_description": "M.S.Dhoni Special Edition T-Shirts.",
|
|
"is_live": true
|
|
}
|
|
],
|
|
"cart_total_amount": 748,
|
|
"coupon_applied": false,
|
|
"products": [],
|
|
"total_saving": 0
|
|
};
|
|
|
|
// Append JSON data as string to formData
|
|
formData.append('order_req', JSON.stringify(jsondata));
|
|
|
|
// Send POST request with headers and formData
|
|
const response = await request.post('https://dev.orderbookings.com/api/order/placeorder', {
|
|
headers: {
|
|
'Content-Type': 'multipart/form-data; boundary=<calculated when request is sent>'
|
|
},
|
|
body: formData
|
|
});
|
|
|
|
const res = await response.json();
|
|
console.log(res);
|
|
});
|
|
// OrderedBy = res.data.ordered_by_name; //you will get user from this.
|
|
// Orderstatus = res.data.order_status; //order status i will get from response
|
|
// OrderId = res.data.order_id; // you will get order id
|
|
|
|
// const orderdetail = new OrderDetails(page);
|
|
// await orderdetail.navigateToOrderDetails(); //navigate to order list
|
|
// await orderdetail.toFindOrders(Orderstatus,OrderedBy); //calling method to find order by status and user
|
|
// const tableValues = await orderdetail.getTablevalues(OrderId); // calling method to get table values
|
|
// const flattenedValues = tableValues.flat();
|
|
// expect(flattenedValues.some(value => value.includes(OrderId))).toBe(true);
|
|
// await page.close();
|
|
//table values compare with the order id and trying to fetch the the data of that order from order list.
|
|
|
|
test('get values of table',async({page})=>{
|
|
|
|
const userdetail = new OrderDetails(page);
|
|
await userdetail.navigateToOrderDetails();
|
|
await userdetail.toFindOrders();
|
|
const tableValues = await userdetail.getTablevalues('670f55a814f563f755f3e2a9');
|
|
const flattenedValues = tableValues.flat();
|
|
expect(flattenedValues.some(value => value.includes('670f55a814f563f755f3e2a9'))).toBe(true);
|
|
console.log(flattenedValues);
|
|
})
|
|
|
|
//cancel order is api request to check whether the order is cancelled or not through the api request and compare with the web ui.
|
|
test('cancel Order',async({request,page})=>{
|
|
let Orderstatus;
|
|
let OrderedBy;
|
|
let Orderphone;
|
|
const response1 = await request.post('https://dev.orderbookings.com//api/order/cancelorder', {
|
|
data: {
|
|
"order_id":"6710bac8b03c253fa86cf9cd"
|
|
}
|
|
|
|
})
|
|
const res = response1.json();
|
|
await console.log(res);
|
|
OrderedBy = res.data.ordered_by_name;
|
|
Orderstatus = res.data.order_status;
|
|
Orderphone = res.data.ordered_by_phone;
|
|
const orderdetail = new OrderDetails(page);
|
|
await orderdetail.navigateToOrderDetails();
|
|
await orderdetail.toFindOrders(Orderstatus,OrderedBy); //calling method to find order by status and user
|
|
const tableValues = await orderdetail.getTablevalues(Orderphone); // calling method to get table values
|
|
const flattenedValues = tableValues.flat();
|
|
expect(flattenedValues.some(value => value.includes(Orderphone))).toBe(true);
|
|
await page.close();
|
|
} )
|
|
|
|
|
|
//category and products are unable to fetch from the api request and unable to compare with the web ui.
|
|
//from tree unable to click mens and women category and unable to fetch the products from the api request and unable to compare with the web ui
|
|
//
|
|
|
|
test('Category and Products', async ({ request,page }) => {
|
|
const catdetails = new OrderDetails(page);
|
|
await catdetails.NavigatetoCatlog();
|
|
// await page.reload();
|
|
let Category1 = await catdetails.NavigatetoMens();
|
|
|
|
let Name1 = await Category1.catnames;
|
|
let catlogViewType1 = await Category1.selecteddcattype;
|
|
let Productviewtype1 = await Category1.selecctedprodtype;
|
|
let Catislive1 = await Category1.isActive;
|
|
let merchantid = await Category1.merchatcode;
|
|
|
|
// const Catproducts1 = await Category1.Productsincluded;
|
|
//await console.log(Catproducts1);
|
|
|
|
//api request
|
|
const response = await request.get('https://dev.orderbookings.com/api/bud/919480707707');
|
|
const res = await response.json();
|
|
// await console.log(res);
|
|
let cat1 =res.data.buds[1].name;
|
|
let catlog1ViewType1 =res.data.buds[1].childview;
|
|
let cat1Productviewtype =res.data.buds[1].product_childview;
|
|
let cat1islive = res.data.buds[1].is_live;
|
|
let merchantcode =res.data.buds[1].merchantCode;
|
|
var cat2 = res.data.buds[2].name; //womens
|
|
var cat3 = res.data.buds[3].name; //kids
|
|
|
|
expect.soft(Name1).toEqual(cat1);
|
|
expect.soft(merchantid).toEqual(merchantcode)
|
|
expect.soft(catlogViewType1).toEqual(catlog1ViewType1);
|
|
expect.soft(Productviewtype1).toEqual(cat1Productviewtype);
|
|
expect.soft(Catislive1).toEqual(cat1islive);
|
|
//expect.soft(Catproducts1).toContain();
|
|
let Category2 = await catdetails.NavigatetoWomens();
|
|
const Name2 = await Category2.catnames;
|
|
const catlogViewType2 = await Category2.selecteddcattype;
|
|
const Productviewtype2 = await Category2.selecctedprodtype;
|
|
const Catislive2 = Category2.isActive;
|
|
console.log('For Womens' +Catislive2);
|
|
// const Catproducts2 = await Category2.Productsincluded;
|
|
|
|
let cat2logViewType =res.data.buds[2].childview;
|
|
let cat2Productviewtype =res.data.buds[2].product_childview;
|
|
let cat2islive = res.data.buds[2].is_live;
|
|
let merchantcode2 =res.data.buds[2].merchantCode;
|
|
|
|
expect.soft(Name2).toEqual(cat2);
|
|
expect.soft(merchantid).toEqual(merchantcode2)
|
|
expect.soft(catlogViewType2).toEqual(cat2logViewType);
|
|
expect.soft(Productviewtype2).toEqual(cat2Productviewtype);
|
|
expect.soft(Catislive2).toEqual(cat2islive);
|
|
// expect.soft(Catproducts2).toEqual(res.data.buds[2].products);
|
|
|
|
//this cat3 is kids
|
|
let Category3 = await catdetails.NavigatetoKids();
|
|
const Name3 = await Category3.catnames;
|
|
const catlogViewType3 = await Category3.selecteddcattype;
|
|
const Productviewtype3 = await Category3.selecctedprodtype;
|
|
const Catislive3 = Category3.isActive;
|
|
console.log('for kids:' +Catislive3);
|
|
//const Catproducts3 = await Category3.Productsincluded;
|
|
|
|
//api request response are in object so we need save in the letibale to compare.
|
|
let cat3ogViewType =res.data.buds[3].childview;
|
|
let cat3Productviewtype =res.data.buds[3].product_childview;
|
|
let cat3islive = res.data.buds[3].is_live;
|
|
let merchantcode3 =res.data.buds[3].merchantCode;
|
|
|
|
expect.soft(Name3).toEqual(cat3);
|
|
expect.soft(merchantid).toEqual(merchantcode3);
|
|
expect.soft(catlogViewType3).toEqual(cat3ogViewType);
|
|
expect.soft(Productviewtype3).toEqual(cat3Productviewtype);
|
|
expect.soft(Catislive3).toEqual(cat3islive);
|
|
//expect.soft(Catproducts3).toContain(res.data.buds[3].products);
|
|
})
|