Files
medusa-store/integration-tests/api/__tests__/admin/analytics-config.js
Kasper Fabricius Kristensen 4de4f20b46 feat(medusa): add analytics config (#2442)
**What**
- Adds new entity AnalyticsConfig
- Adds new service AnalyticsConfigService
- Adds new repository AnalyticsConfigRepository
- Adds new endpoints to get, create, update, and delete analytics configs

**Why**
As we begin gathering usage insights to help us improve Medusa, we want to give each individual users the ability to control what data they share with us, or not share any data with us at all. The AnalyticsConfig holds information that is used to check if the user wishes for their data to be anonymized or if they have opted out of sharing usage data.

The entire feature can be disabled on a store level by setting the feature flag `MEDUSA_FF_ANALYTICS=false` in their environment variables, the feature is enabled by default. 

**Testing**
Adds integration test for each of the new endpoints

Resolves CORE-656, CORE-655, CORE-654

Also resolves CORE-574
2022-10-21 13:04:46 +00:00

206 lines
5.1 KiB
JavaScript

const path = require("path")
const startServerWithEnvironment =
require("../../../helpers/start-server-with-environment").default
const { useApi } = require("../../../helpers/use-api")
const { useDb } = require("../../../helpers/use-db")
const {
simpleAnalyticsConfigFactory,
} = require("../../factories/simple-analytics-config-factory")
const adminSeeder = require("../../helpers/admin-seeder")
const adminReqConfig = {
headers: {
Authorization: "Bearer test_token",
},
}
jest.setTimeout(30000)
describe("[MEDUSA_FF_ANALYTICS] /admin/analytics-config", () => {
let medusaProcess
let dbConnection
beforeAll(async () => {
const cwd = path.resolve(path.join(__dirname, "..", ".."))
const [process, connection] = await startServerWithEnvironment({
cwd,
env: { MEDUSA_FF_ANALYTICS: true },
})
dbConnection = connection
medusaProcess = process
})
afterAll(async () => {
const db = useDb()
await db.shutdown()
medusaProcess.kill()
})
describe("GET /admin/analytics-config", () => {
beforeEach(async () => {
await adminSeeder(dbConnection)
})
afterEach(async () => {
const db = useDb()
await db.teardown()
})
it("should retrieve config for logged in user if it exists", async () => {
// Create config
await simpleAnalyticsConfigFactory(dbConnection)
const api = useApi()
const response = await api.get(`/admin/analytics-configs`, adminReqConfig)
expect(response.data).toMatchSnapshot({
analytics_config: {
id: expect.any(String),
user_id: "admin_user",
opt_out: false,
anonymize: false,
created_at: expect.any(String),
updated_at: expect.any(String),
},
})
})
it("should return 404 if no config exists", async () => {
const api = useApi()
const err = await api
.get(`/admin/analytics-configs`, adminReqConfig)
.catch((err) => err)
expect(err).toBeTruthy()
expect(err.response.status).toEqual(404)
expect(err.response.data.message).toEqual(
"No analytics config found for user with id: admin_user"
)
})
})
describe("POST /admin/analytics-config", () => {
beforeEach(async () => {
await adminSeeder(dbConnection)
})
afterEach(async () => {
const db = useDb()
await db.teardown()
})
it("should create a new config for logged in user", async () => {
const api = useApi()
const response = await api
.post(
`/admin/analytics-configs`,
{
opt_out: true,
anonymize: true,
},
adminReqConfig
)
.catch((e) => console.log(e))
expect(response.data).toMatchSnapshot({
analytics_config: {
id: expect.any(String),
user_id: "admin_user",
opt_out: true,
anonymize: true,
created_at: expect.any(String),
updated_at: expect.any(String),
},
})
})
})
describe("POST /admin/analytics-config/update", () => {
beforeEach(async () => {
await adminSeeder(dbConnection)
})
afterEach(async () => {
const db = useDb()
await db.teardown()
})
it("should update the config of the logged in user", async () => {
// Create config
await simpleAnalyticsConfigFactory(dbConnection)
const api = useApi()
const response = await api.post(
`/admin/analytics-configs/update`,
{
opt_out: true,
},
adminReqConfig
)
expect(response.data).toMatchSnapshot({
analytics_config: {
id: expect.any(String),
user_id: "admin_user",
opt_out: true,
anonymize: false,
created_at: expect.any(String),
updated_at: expect.any(String),
},
})
})
it("should create a config for the user is no config exists", async () => {
const api = useApi()
const res = await api.post(
`/admin/analytics-configs/update`,
{
opt_out: true,
},
adminReqConfig
)
expect(res.data).toMatchSnapshot({
analytics_config: {
id: expect.any(String),
user_id: "admin_user",
opt_out: true,
anonymize: false,
created_at: expect.any(String),
updated_at: expect.any(String),
},
})
})
})
describe("DELETE /admin/analytics-config", () => {
beforeEach(async () => {
await adminSeeder(dbConnection)
})
afterEach(async () => {
const db = useDb()
await db.teardown()
})
it("should delete the config of the logged in user", async () => {
// Create config
await simpleAnalyticsConfigFactory(dbConnection)
const api = useApi()
const response = await api.delete(
`/admin/analytics-configs`,
adminReqConfig
)
expect(response.status).toEqual(200)
expect(response.data).toEqual({
user_id: "admin_user",
object: "analytics_config",
deleted: true,
})
})
})
})