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:
1 parent
cfd3e396cf
commit
56d1d326d4
6 files changed
+78
-35
No files matched your search
@@ -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(() => {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in new issue
Block a user