Fix(medusa): Return correct region count (#4514)

* update method for listing regions

* add changeset

* fix unit tests

* fix nit

---------

Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
This commit is contained in:
Philip Korsholm
2023-07-13 08:59:26 +02:00
committed by GitHub
co-authored by Oliver Windall Juhl
parent cfd3e396cf
commit 56d1d326d4
6 changed files with 78 additions and 35 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---
fix(medusa): provide correct count of regions
@@ -183,6 +183,20 @@ describe("/admin/regions", () => {
expect(response.status).toEqual(200)
})
it("returns count of total regions", async () => {
const api = useApi()
const response = await api.get(`/admin/regions?limit=2`, {
headers: {
Authorization: "Bearer test_token",
},
})
expect(response.data.regions).toHaveLength(2)
expect(response.data.count).toEqual(3)
expect(response.status).toEqual(200)
})
it("filters correctly on update", async () => {
const api = useApi()
@@ -351,7 +365,7 @@ describe("[MEDUSA_FF_TAX_INCLUSIVE_PRICING] /admin/regions", () => {
includes_tax: true,
}
let response = await api
const response = await api
.post(`/admin/regions`, payload, adminReqConfig)
.catch((err) => {
console.log(err)
@@ -1,6 +1,6 @@
import { IdMap } from "medusa-test-utils"
import { request } from "../../../../../helpers/test-request"
import { RegionServiceMock } from "../../../../../services/__mocks__/region"
import { request } from "../../../../../helpers/test-request"
const defaultFields = [
"id",
@@ -46,8 +46,8 @@ describe("GET /admin/regions", () => {
})
it("calls service list", () => {
expect(RegionServiceMock.list).toHaveBeenCalledTimes(1)
expect(RegionServiceMock.list).toHaveBeenCalledWith(
expect(RegionServiceMock.listAndCount).toHaveBeenCalledTimes(1)
expect(RegionServiceMock.listAndCount).toHaveBeenCalledWith(
{},
{
select: defaultFields,
@@ -81,8 +81,8 @@ describe("GET /admin/regions", () => {
})
it("calls service list", () => {
expect(RegionServiceMock.list).toHaveBeenCalledTimes(1)
expect(RegionServiceMock.list).toHaveBeenCalledWith(
expect(RegionServiceMock.listAndCount).toHaveBeenCalledTimes(1)
expect(RegionServiceMock.listAndCount).toHaveBeenCalledWith(
{},
{
select: defaultFields,
@@ -105,14 +105,14 @@ export default async (req, res) => {
take: validated.limit,
}
const regions: Region[] = await regionService.list(
const [regions, count] = await regionService.listAndCount(
_.pickBy(filterableFields, identity),
listConfig
)
res.json({
regions,
count: regions.length,
count,
offset: validated.offset,
limit: validated.limit,
})
@@ -46,7 +46,7 @@ export const RegionServiceMock = {
withTransaction: function () {
return this
},
retrieve: jest.fn().mockImplementation(regionId => {
retrieve: jest.fn().mockImplementation((regionId) => {
if (regionId === IdMap.getId("testRegion")) {
return Promise.resolve(regions.testRegion)
}
@@ -64,30 +64,36 @@ export const RegionServiceMock = {
}
return Promise.resolve(regions.testRegion)
}),
delete: jest.fn().mockImplementation(data => Promise.resolve()),
delete: jest.fn().mockImplementation((data) => Promise.resolve()),
create: jest
.fn()
.mockImplementation(data => Promise.resolve({ id: "region" })),
addCountry: jest.fn().mockImplementation(data => Promise.resolve()),
.mockImplementation((data) => Promise.resolve({ id: "region" })),
addCountry: jest.fn().mockImplementation((data) => Promise.resolve()),
addFulfillmentProvider: jest
.fn()
.mockImplementation(data => Promise.resolve()),
addPaymentProvider: jest.fn().mockImplementation(data => Promise.resolve()),
removeCountry: jest.fn().mockImplementation(data => Promise.resolve()),
.mockImplementation((data) => Promise.resolve()),
addPaymentProvider: jest.fn().mockImplementation((data) => Promise.resolve()),
removeCountry: jest.fn().mockImplementation((data) => Promise.resolve()),
removeFulfillmentProvider: jest
.fn()
.mockImplementation(data => Promise.resolve()),
.mockImplementation((data) => Promise.resolve()),
removePaymentProvider: jest
.fn()
.mockImplementation(data => Promise.resolve()),
update: jest.fn().mockImplementation(data => Promise.resolve()),
list: jest.fn().mockImplementation(data => {
.mockImplementation((data) => Promise.resolve()),
update: jest.fn().mockImplementation((data) => Promise.resolve()),
list: jest.fn().mockImplementation((data) => {
return Promise.resolve([
regions.testRegion,
regions.regionFrance,
regions.regionUs,
])
}),
listAndCount: jest.fn().mockImplementation((data) => {
return Promise.resolve([
[regions.testRegion, regions.regionFrance, regions.regionUs],
3,
])
}),
}
const mock = jest.fn().mockImplementation(() => {
+34 -16
View File
@@ -1,25 +1,24 @@
import { DeepPartial, EntityManager } from "typeorm"
import { isDefined, MedusaError } from "medusa-core-utils"
import { TransactionBaseService } from "../interfaces"
import TaxInclusivePricingFeatureFlag from "../loaders/feature-flags/tax-inclusive-pricing"
import { Country, Currency, Region } from "../models"
import { CreateRegionInput, UpdateRegionInput } from "../types/region"
import { DeepPartial, EntityManager } from "typeorm"
import { FindConfig, Selector } from "../types/common"
import { MedusaError, isDefined } from "medusa-core-utils"
import { buildQuery, setMetadata } from "../utils"
import { CountryRepository } from "../repositories/country"
import { CurrencyRepository } from "../repositories/currency"
import { FulfillmentProviderRepository } from "../repositories/fulfillment-provider"
import { PaymentProviderRepository } from "../repositories/payment-provider"
import { RegionRepository } from "../repositories/region"
import { TaxProviderRepository } from "../repositories/tax-provider"
import { FindConfig, Selector } from "../types/common"
import { CreateRegionInput, UpdateRegionInput } from "../types/region"
import { buildQuery, setMetadata } from "../utils"
import { countries } from "../utils/countries"
import { FlagRouter } from "../utils/flag-router"
import EventBusService from "./event-bus"
import { FlagRouter } from "../utils/flag-router"
import { FulfillmentProviderRepository } from "../repositories/fulfillment-provider"
import FulfillmentProviderService from "./fulfillment-provider"
import { PaymentProviderRepository } from "../repositories/payment-provider"
import { PaymentProviderService } from "./index"
import { RegionRepository } from "../repositories/region"
import StoreService from "./store"
import TaxInclusivePricingFeatureFlag from "../loaders/feature-flags/tax-inclusive-pricing"
import { TaxProviderRepository } from "../repositories/tax-provider"
import { TransactionBaseService } from "../interfaces"
import { countries } from "../utils/countries"
type InjectedDependencies = {
manager: EntityManager
@@ -511,12 +510,31 @@ class RegionService extends TransactionBaseService {
take: 10,
}
): Promise<Region[]> {
const [regions] = await this.listAndCount(selector, config)
return regions
}
/**
* Lists all regions based on a query and returns them along with count
*
* @param {object} selector - query object for find
* @param {object} config - configuration settings
* @return {Promise} result of the find operation
*/
async listAndCount(
selector: Selector<Region> = {},
config: FindConfig<Region> = {
relations: [],
skip: 0,
take: 10,
}
): Promise<[Region[], number]> {
const regionRepo = this.activeManager_.withRepository(
this.regionRepository_
)
const query = buildQuery(selector, config)
return regionRepo.find(query)
return await regionRepo.findAndCount(query)
}
/**