Skip to content

Commit

Permalink
feat: fixed the bulkCreate script
Browse files Browse the repository at this point in the history
  • Loading branch information
GaelFerrand committed Feb 6, 2025
1 parent 0f71d69 commit 5a8e55b
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 49 deletions.
3 changes: 0 additions & 3 deletions back/src/companies/repository/company/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ export type CreateCompanyFn = (
logMetadata?: LogMetadata
) => Promise<Company>;

// TODO: anonymous Company
// TODO: batch creation

export const buildCreateCompany = (deps: RepositoryFnDeps): CreateCompanyFn => {
return async data => {
const { prisma } = deps;
Expand Down
40 changes: 32 additions & 8 deletions back/src/users/bulk-creation/__tests__/bulk-create.integration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ describe("bulk create users and companies from csv files", () => {
jest.mock("../../../companies/search");
(searchCompany as jest.Mock)
.mockResolvedValue({
siret: "85001946400013",
siret: "85001946400021",
name: "Code en stock",
statutDiffusionEtablissement: "O",
etatAdministratif: "A"
Expand All @@ -54,7 +54,7 @@ describe("bulk create users and companies from csv files", () => {
// In the test data we have
//
// 2 companies:
// - Code en Stock 85001946400013
// - Code en Stock 85001946400021
// - Frontier SAS 81343950200028
//
// and 3 users
Expand Down Expand Up @@ -115,7 +115,7 @@ describe("bulk create users and companies from csv files", () => {

// check fields are OK for first company
const codeEnStock = await prisma.company.findUniqueOrThrow({
where: { siret: "85001946400013" }
where: { siret: "85001946400021" }
});
expect(codeEnStock.name).toEqual("NAME FROM SIRENE");
expect(codeEnStock.givenName).toEqual("Code en Stock");
Expand Down Expand Up @@ -145,15 +145,15 @@ describe("bulk create users and companies from csv files", () => {

test("already existing company", async () => {
// assume Code en Stock was already created
const codeEnStock = await companyFactory({ siret: "85001946400013" });
const codeEnStock = await companyFactory({ siret: "85001946400021" });

await bulkCreateIdempotent();

await expectNumberOfRecords(2, 3, 4);

// Code en stock should be untouched
expect(
await prisma.company.findUnique({ where: { siret: "85001946400013" } })
await prisma.company.findUnique({ where: { siret: "85001946400021" } })
).toEqual(codeEnStock);
}, 10000);

Expand Down Expand Up @@ -181,7 +181,7 @@ describe("bulk create users and companies from csv files", () => {

// associations should exist between John Snow and Code en Stock
const associations = await prisma.companyAssociation.findMany({
where: { user: { id: john.id }, company: { siret: "85001946400013" } }
where: { user: { id: john.id }, company: { siret: "85001946400021" } }
});
expect(associations).toHaveLength(1);
expect(associations[0].role).toEqual("ADMIN");
Expand All @@ -190,7 +190,7 @@ describe("bulk create users and companies from csv files", () => {
test("already existing user with existing role in company", async () => {
// John Snow and Code en Stock already exist
const john = await userFactory({ email: "[email protected]" });
const codeEnStock = await companyFactory({ siret: "85001946400013" });
const codeEnStock = await companyFactory({ siret: "85001946400021" });
// and John Snow is member of Code en Stock
const role = await prisma.companyAssociation.create({
data: {
Expand Down Expand Up @@ -260,7 +260,7 @@ describe("bulk create users and companies from csv files", () => {

test("role in csv already in pending invitation", async () => {
// assume John Snow was already invited to Trackdéchets
const company = await companyFactory({ siret: "85001946400013" });
const company = await companyFactory({ siret: "85001946400021" });
const invitation = await prisma.userAccountHash.create({
data: {
email: "[email protected]",
Expand Down Expand Up @@ -292,4 +292,28 @@ describe("bulk create users and companies from csv files", () => {
});
expect(updatedInvitation.acceptedAt).not.toBeNull();
}, 10000);

test("should fill company's splitted address", async () => {
await bulkCreateIdempotent();

await expectNumberOfRecords(2, 3, 4);

// check fields are OK for first user
const john = await prisma.user.findUniqueOrThrow({
where: { email: "[email protected]" }
});
expect(john.name).toEqual("[email protected]");
expect(john.isActive).toEqual(true);
expect(john.activatedAt).toBeTruthy();
expect(john.firstAssociationDate).toBeTruthy();

// check fields are OK for first company
const codeEnStock = await prisma.company.findUniqueOrThrow({
where: { siret: "85001946400021" }
});
expect(codeEnStock.street).toEqual("40 BOULEVARD VOLTAIRE BAT G");
expect(codeEnStock.postalCode).toEqual("13001");
expect(codeEnStock.city).toEqual("MARSEILLE");
expect(codeEnStock.country).toEqual("FR");
}, 10000);
});
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"siret";"gerepId";"companyTypes";"collectorTypes";"wasteProcessorTypes";"wasteVehiclesTypes";"givenName";"contactEmail";"contactPhone";"contact";"website"
"85001946400013";"1234";"PRODUCER";;;;"Code en Stock";"[email protected]";"0600000000";"Marcel Machin";"https://codeenstock.trackdechets.fr"
"85001946400021";"1234";"PRODUCER";;;;"Code en Stock";"[email protected]";"0600000000";"Marcel Machin";"https://codeenstock.trackdechets.fr"
"81343950200028";"2345";"PRODUCER,WASTEPROCESSOR";;"OTHER_DANGEROUS_WASTES";;"Frontier SAS";"[email protected]";"0700000000";;"https://frontier.trackdechets.fr"
4 changes: 2 additions & 2 deletions back/src/users/bulk-creation/__tests__/csv/roles.csv
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"siret";"email";"role"
"85001946400013";"[email protected]";"ADMIN"
"85001946400021";"[email protected]";"ADMIN"
"81343950200028";"[email protected]";"ADMIN"
"85001946400013";"[email protected]";"MEMBER"
"85001946400021";"[email protected]";"MEMBER"
"81343950200028";"[email protected]";"MEMBER"
73 changes: 38 additions & 35 deletions back/src/users/bulk-creation/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
} from "@prisma/client";
import { CompanyInfo, CompanyRow, RoleRow } from "./types";
import { UserInputError } from "../../common/errors";
import { getCompanyRepository } from "../../companies/repository";

function printHelp() {
console.log(`
Expand Down Expand Up @@ -82,7 +83,6 @@ export async function bulkCreate(opts: Opts): Promise<void> {

// perform validation
for (const company of companiesRows) {
console.info(`Validate company ${company.siret}`);
try {
const validCompany = await companyValidationSchema.validate(company);
companies.push(validCompany);
Expand Down Expand Up @@ -158,40 +158,43 @@ export async function bulkCreate(opts: Opts): Promise<void> {
});
if (!existingCompany) {
console.info(`Create company ${company.siret}`);
await prisma.company.create({
data: {
orgId: company.siret,
siret: company.siret,
verificationStatus: CompanyVerificationStatus.VERIFIED,
verificationMode: CompanyVerificationMode.MANUAL,
verifiedAt: new Date(),
verificationComment: "Import en masse",
codeNaf: company.codeNaf,
gerepId: company.gerepId,
name: company.name!,
companyTypes: {
set: company.companyTypes as CompanyType[]
},
collectorTypes: {
set: company.collectorTypes as CollectorType[]
},
wasteProcessorTypes: {
set: company.wasteProcessorTypes as WasteProcessorType[]
},
wasteVehiclesTypes: {
set: company.wasteVehiclesTypes as WasteVehiclesType[]
},
securityCode: randomNumber(4),
givenName: company.givenName,
contactEmail: company.contactEmail,
contactPhone: company.contactPhone,
contact: company.contact,
website: company.website,
verificationCode: randomNumber(5).toString(),
address: company.address,
latitude: company.latitude,
longitude: company.longitude
}

const { createCompany } = await getCompanyRepository({
id: "support_tech"
} as Express.User);

await createCompany({
orgId: company.siret,
siret: company.siret,
verificationStatus: CompanyVerificationStatus.VERIFIED,
verificationMode: CompanyVerificationMode.MANUAL,
verifiedAt: new Date(),
verificationComment: "Import en masse",
codeNaf: company.codeNaf,
gerepId: company.gerepId,
name: company.name!,
companyTypes: {
set: company.companyTypes as CompanyType[]
},
collectorTypes: {
set: company.collectorTypes as CollectorType[]
},
wasteProcessorTypes: {
set: company.wasteProcessorTypes as WasteProcessorType[]
},
wasteVehiclesTypes: {
set: company.wasteVehiclesTypes as WasteVehiclesType[]
},
securityCode: randomNumber(4),
givenName: company.givenName,
contactEmail: company.contactEmail,
contactPhone: company.contactPhone,
contact: company.contact,
website: company.website,
verificationCode: randomNumber(5).toString(),
address: company.address,
latitude: company.latitude,
longitude: company.longitude
});
}
}
Expand Down

0 comments on commit 5a8e55b

Please sign in to comment.