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 KorsholmandOliver Windall Juhl authored and GitHub committed 2023-07-13 08:59:26 +02:00
1 parent cfd3e396cf
commit 56d1d326d4
6 files changed
+78 -35

No files matched your search

+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) 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 () => { it("filters correctly on update", async () => {
const api = useApi() const api = useApi()
@@ -351,7 +365,7 @@ describe("[MEDUSA_FF_TAX_INCLUSIVE_PRICING] /admin/regions", () => {
includes_tax: true, includes_tax: true,
} }
let response = await api const response = await api
.post(`/admin/regions`, payload, adminReqConfig) .post(`/admin/regions`, payload, adminReqConfig)
.catch((err) => { .catch((err) => {
console.log(err) console.log(err)
@@ -1,6 +1,6 @@
import { IdMap } from "medusa-test-utils" import { IdMap } from "medusa-test-utils"
import { request } from "../../../../../helpers/test-request"
import { RegionServiceMock } from "../../../../../services/__mocks__/region" import { RegionServiceMock } from "../../../../../services/__mocks__/region"
import { request } from "../../../../../helpers/test-request"
const defaultFields = [ const defaultFields = [
"id", "id",
@@ -46,8 +46,8 @@ describe("GET /admin/regions", () => {
}) })
it("calls service list", () => { it("calls service list", () => {
expect(RegionServiceMock.list).toHaveBeenCalledTimes(1) expect(RegionServiceMock.listAndCount).toHaveBeenCalledTimes(1)
expect(RegionServiceMock.list).toHaveBeenCalledWith( expect(RegionServiceMock.listAndCount).toHaveBeenCalledWith(
{}, {},
{ {
select: defaultFields, select: defaultFields,
@@ -81,8 +81,8 @@ describe("GET /admin/regions", () => {
}) })
it("calls service list", () => { it("calls service list", () => {
expect(RegionServiceMock.list).toHaveBeenCalledTimes(1) expect(RegionServiceMock.listAndCount).toHaveBeenCalledTimes(1)
expect(RegionServiceMock.list).toHaveBeenCalledWith( expect(RegionServiceMock.listAndCount).toHaveBeenCalledWith(
{}, {},
{ {
select: defaultFields, select: defaultFields,
@@ -105,14 +105,14 @@ export default async (req, res) => {
take: validated.limit, take: validated.limit,
} }
const regions: Region[] = await regionService.list( const [regions, count] = await regionService.listAndCount(
_.pickBy(filterableFields, identity), _.pickBy(filterableFields, identity),
listConfig listConfig
) )
res.json({ res.json({
regions, regions,
count: regions.length, count,
offset: validated.offset, offset: validated.offset,
limit: validated.limit, limit: validated.limit,
}) })
@@ -46,7 +46,7 @@ export const RegionServiceMock = {
withTransaction: function () { withTransaction: function () {
return this return this
}, },
retrieve: jest.fn().mockImplementation(regionId => { retrieve: jest.fn().mockImplementation((regionId) => {
if (regionId === IdMap.getId("testRegion")) { if (regionId === IdMap.getId("testRegion")) {
return Promise.resolve(regions.testRegion) return Promise.resolve(regions.testRegion)
} }
@@ -64,30 +64,36 @@ export const RegionServiceMock = {
} }
return Promise.resolve(regions.testRegion) return Promise.resolve(regions.testRegion)
}), }),
delete: jest.fn().mockImplementation(data => Promise.resolve()), delete: jest.fn().mockImplementation((data) => Promise.resolve()),
create: jest create: jest
.fn() .fn()
.mockImplementation(data => Promise.resolve({ id: "region" })), .mockImplementation((data) => Promise.resolve({ id: "region" })),
addCountry: jest.fn().mockImplementation(data => Promise.resolve()), addCountry: jest.fn().mockImplementation((data) => Promise.resolve()),
addFulfillmentProvider: jest addFulfillmentProvider: jest
.fn() .fn()
.mockImplementation(data => Promise.resolve()), .mockImplementation((data) => Promise.resolve()),
addPaymentProvider: jest.fn().mockImplementation(data => Promise.resolve()), addPaymentProvider: jest.fn().mockImplementation((data) => Promise.resolve()),
removeCountry: jest.fn().mockImplementation(data => Promise.resolve()), removeCountry: jest.fn().mockImplementation((data) => Promise.resolve()),
removeFulfillmentProvider: jest removeFulfillmentProvider: jest
.fn() .fn()
.mockImplementation(data => Promise.resolve()), .mockImplementation((data) => Promise.resolve()),
removePaymentProvider: jest removePaymentProvider: jest
.fn() .fn()
.mockImplementation(data => Promise.resolve()), .mockImplementation((data) => Promise.resolve()),
update: jest.fn().mockImplementation(data => Promise.resolve()), update: jest.fn().mockImplementation((data) => Promise.resolve()),
list: jest.fn().mockImplementation(data => { list: jest.fn().mockImplementation((data) => {
return Promise.resolve([ return Promise.resolve([
regions.testRegion, regions.testRegion,
regions.regionFrance, regions.regionFrance,
regions.regionUs, regions.regionUs,
]) ])
}), }),
listAndCount: jest.fn().mockImplementation((data) => {
return Promise.resolve([
[regions.testRegion, regions.regionFrance, regions.regionUs],
3,
])
}),
} }
const mock = jest.fn().mockImplementation(() => { 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 { 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 { CountryRepository } from "../repositories/country"
import { CurrencyRepository } from "../repositories/currency" 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 EventBusService from "./event-bus"
import { FlagRouter } from "../utils/flag-router"
import { FulfillmentProviderRepository } from "../repositories/fulfillment-provider"
import FulfillmentProviderService from "./fulfillment-provider" import FulfillmentProviderService from "./fulfillment-provider"
import { PaymentProviderRepository } from "../repositories/payment-provider"
import { PaymentProviderService } from "./index" import { PaymentProviderService } from "./index"
import { RegionRepository } from "../repositories/region"
import StoreService from "./store" 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 = { type InjectedDependencies = {
manager: EntityManager manager: EntityManager
@@ -511,12 +510,31 @@ class RegionService extends TransactionBaseService {
take: 10, take: 10,
} }
): Promise<Region[]> { ): 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( const regionRepo = this.activeManager_.withRepository(
this.regionRepository_ this.regionRepository_
) )
const query = buildQuery(selector, config) const query = buildQuery(selector, config)
return regionRepo.find(query) return await regionRepo.findAndCount(query)
} }
/** /**