From fe01b49df11fd453da44484da01016ac8e8ba465 Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Tue, 28 Oct 2025 11:31:02 +1000 Subject: [PATCH] [PM-26671] Google workspace integration tests (#894) Add tests for Google Workspace - not enabled in CI yet --- .github/workflows/integration-test.yml | 10 +-- .gitignore | 3 + docker-compose.yml | 4 +- openldap/mkcert.sh | 10 --- package.json | 2 +- src/services/batch-requests-builder.spec.ts | 2 +- ...uite-directory.service.integration.spec.ts | 82 +++++++++++++++++++ ...ldap-directory.service.integration.spec.ts | 10 +-- src/services/single-request-builder.spec.ts | 2 +- src/services/sync.service.integration.spec.ts | 7 +- src/services/sync.service.spec.ts | 6 +- utils/.env.example | 4 + utils/google-workspace/config-fixtures.ts | 56 +++++++++++++ utils/google-workspace/group-fixtures.ts | 26 ++++++ utils/google-workspace/user-fixtures.ts | 50 +++++++++++ .../openldap/config-fixtures.ts | 4 +- .../example-ldifs/directory-100.ldif | 0 .../example-ldifs/directory-11000.ldif | 0 .../example-ldifs/directory-250.ldif | 0 .../openldap}/example-ldifs/directory-50.ldif | 0 .../example-ldifs/directory-500.ldif | 0 .../openldap}/group-fixtures.ts | 2 +- .../openldap}/ldifs/directory-20.ldif | 0 utils/openldap/mkcert.sh | 10 +++ {openldap => utils/openldap}/user-fixtures.ts | 2 +- .../utils => utils}/request-builder-helper.ts | 4 +- 26 files changed, 259 insertions(+), 37 deletions(-) delete mode 100755 openldap/mkcert.sh create mode 100644 src/services/gsuite-directory.service.integration.spec.ts create mode 100644 utils/.env.example create mode 100644 utils/google-workspace/config-fixtures.ts create mode 100644 utils/google-workspace/group-fixtures.ts create mode 100644 utils/google-workspace/user-fixtures.ts rename src/utils/test-fixtures.ts => utils/openldap/config-fixtures.ts (90%) rename {openldap => utils/openldap}/example-ldifs/directory-100.ldif (100%) rename {openldap => utils/openldap}/example-ldifs/directory-11000.ldif (100%) rename {openldap => utils/openldap}/example-ldifs/directory-250.ldif (100%) rename {openldap => utils/openldap}/example-ldifs/directory-50.ldif (100%) rename {openldap => utils/openldap}/example-ldifs/directory-500.ldif (100%) rename {openldap => utils/openldap}/group-fixtures.ts (97%) rename {openldap => utils/openldap}/ldifs/directory-20.ldif (100%) create mode 100755 utils/openldap/mkcert.sh rename {openldap => utils/openldap}/user-fixtures.ts (99%) rename {src/utils => utils}/request-builder-helper.ts (85%) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 2d65e016..d08f6729 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -8,14 +8,14 @@ on: paths: - ".github/workflows/integration-test.yml" # this file - "src/services/ldap-directory.service*" # we only have integration for LDAP testing at the moment - - "./openldap/**/*" # any change to test fixtures + - "./utils/**/*" # any change to test fixtures - "./docker-compose.yml" # any change to Docker configuration - "./package.json" # dependencies pull_request: paths: - ".github/workflows/integration-test.yml" # this file - "src/services/ldap-directory.service*" # we only have integration for LDAP testing at the moment - - "./openldap/**/*" # any change to test fixtures + - "./utils/**/*" # any change to test fixtures - "./docker-compose.yml" # any change to Docker configuration - "./package.json" # dependencies permissions: @@ -55,11 +55,11 @@ jobs: sudo apt-get update sudo apt-get -y install mkcert - - name: Setup integration tests + - name: Setup LDAP integration tests run: npm run test:integration:setup - - name: Run integration tests - run: npm run test:integration --coverage + - name: Run LDAP integration tests + run: npx jest ldap-directory.service.integration.spec.ts --coverage - name: Report test results uses: dorny/test-reporter@dc3a92680fcc15842eef52e8c4606ea7ce6bd3f3 # v2.1.1 diff --git a/.gitignore b/.gitignore index 8cd7708f..69cc709d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ .DS_Store Thumbs.db +# Environment variables used for tests +.env + # IDEs and editors .idea/ .project diff --git a/docker-compose.yml b/docker-compose.yml index 935cb6aa..65a347a6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,8 +11,8 @@ services: - LDAP_TLS_KEY_FILE=/certs/openldap-key.pem - LDAP_TLS_CA_FILE=/certs/rootCA.pem volumes: - - "./openldap/ldifs:/ldifs" - - "./openldap/certs:/certs" + - "./utils/openldap/ldifs:/ldifs" + - "./utils/openldap/certs:/certs" ports: - "1389:1389" - "1636:1636" diff --git a/openldap/mkcert.sh b/openldap/mkcert.sh deleted file mode 100755 index 86424a40..00000000 --- a/openldap/mkcert.sh +++ /dev/null @@ -1,10 +0,0 @@ -if ! [ -x "$(command -v mkcert)" ]; then - echo 'Error: mkcert is not installed. Install mkcert first and then re-run this script.' - echo 'e.g. brew install mkcert' - exit 1 -fi - -mkcert -install -mkdir -p ./openldap/certs -cp "$(mkcert -CAROOT)/rootCA.pem" ./openldap/certs/rootCA.pem -mkcert -key-file ./openldap/certs/openldap-key.pem -cert-file ./openldap/certs/openldap.pem localhost openldap diff --git a/package.json b/package.json index b4aeec5d..ff76e522 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "test:watch:all": "jest --watchAll --testPathIgnorePatterns=.integration.spec.ts", "test:integration": "jest .integration.spec.ts", "test:integration:watch": "jest .integration.spec.ts --watch", - "test:integration:setup": "sh ./openldap/mkcert.sh && docker compose up -d", + "test:integration:setup": "sh ./utils/openldap/mkcert.sh && docker compose up -d", "test:types": "npx tsc --noEmit" }, "devDependencies": { diff --git a/src/services/batch-requests-builder.spec.ts b/src/services/batch-requests-builder.spec.ts index 79cd80cf..0a0dd821 100644 --- a/src/services/batch-requests-builder.spec.ts +++ b/src/services/batch-requests-builder.spec.ts @@ -2,8 +2,8 @@ import { GetUniqueString } from "@/jslib/common/spec/utils"; import { UserEntry } from "@/src/models/userEntry"; +import { groupSimulator, userSimulator } from "../../utils/request-builder-helper"; import { RequestBuilderOptions } from "../abstractions/request-builder.service"; -import { groupSimulator, userSimulator } from "../utils/request-builder-helper"; import { BatchRequestBuilder } from "./batch-request-builder"; diff --git a/src/services/gsuite-directory.service.integration.spec.ts b/src/services/gsuite-directory.service.integration.spec.ts new file mode 100644 index 00000000..c58de957 --- /dev/null +++ b/src/services/gsuite-directory.service.integration.spec.ts @@ -0,0 +1,82 @@ +import { config as dotenvConfig } from "dotenv"; +import { mock, MockProxy } from "jest-mock-extended"; + +import { I18nService } from "../../jslib/common/src/abstractions/i18n.service"; +import { LogService } from "../../jslib/common/src/abstractions/log.service"; +import { + getGSuiteConfiguration, + getSyncConfiguration, +} from "../../utils/google-workspace/config-fixtures"; +import { groupFixtures } from "../../utils/google-workspace/group-fixtures"; +import { userFixtures } from "../../utils/google-workspace/user-fixtures"; +import { DirectoryType } from "../enums/directoryType"; + +import { GSuiteDirectoryService } from "./gsuite-directory.service"; +import { StateService } from "./state.service"; + +// These tests integrate with a test Google Workspace instance. +// Credentials are located in the shared Bitwarden collection for Directory Connector testing. +// Place the .env file attachment in the utils folder. + +// Load .env variables +dotenvConfig({ path: "utils/.env" }); + +// These filters target integration test data. +// These should return data that matches the user and group fixtures exactly. +// There may be additional data present if not used. +const INTEGRATION_USER_FILTER = + "exclude:integration-user-a@bwrox.dev|orgUnitPath='/Integration testing'"; +const INTEGRATION_GROUP_FILTER = "|name:Integration*"; + +describe("gsuiteDirectoryService", () => { + let logService: MockProxy; + let i18nService: MockProxy; + let stateService: MockProxy; + + let directoryService: GSuiteDirectoryService; + + beforeEach(() => { + logService = mock(); + i18nService = mock(); + stateService = mock(); + + stateService.getDirectoryType.mockResolvedValue(DirectoryType.GSuite); + stateService.getLastUserSync.mockResolvedValue(null); // do not filter results by last modified date + i18nService.t.mockImplementation((id) => id); // passthrough implementation for any error messages + + directoryService = new GSuiteDirectoryService(logService, i18nService, stateService); + }); + + it("syncs without using filters (includes test data)", async () => { + const directoryConfig = getGSuiteConfiguration(); + stateService.getDirectory.calledWith(DirectoryType.GSuite).mockResolvedValue(directoryConfig); + + const syncConfig = getSyncConfiguration({ + groups: true, + users: true, + }); + stateService.getSync.mockResolvedValue(syncConfig); + + const result = await directoryService.getEntries(true, true); + + expect(result[0]).toEqual(expect.arrayContaining(groupFixtures)); + expect(result[1]).toEqual(expect.arrayContaining(userFixtures)); + }); + + it("syncs using user and group filters (exact match for test data)", async () => { + const directoryConfig = getGSuiteConfiguration(); + stateService.getDirectory.calledWith(DirectoryType.GSuite).mockResolvedValue(directoryConfig); + + const syncConfig = getSyncConfiguration({ + groups: true, + users: true, + userFilter: INTEGRATION_USER_FILTER, + groupFilter: INTEGRATION_GROUP_FILTER, + }); + stateService.getSync.mockResolvedValue(syncConfig); + + const result = await directoryService.getEntries(true, true); + + expect(result).toEqual([groupFixtures, userFixtures]); + }); +}); diff --git a/src/services/ldap-directory.service.integration.spec.ts b/src/services/ldap-directory.service.integration.spec.ts index 7cbf9252..c780f4c6 100644 --- a/src/services/ldap-directory.service.integration.spec.ts +++ b/src/services/ldap-directory.service.integration.spec.ts @@ -2,10 +2,10 @@ import { mock, MockProxy } from "jest-mock-extended"; import { I18nService } from "../../jslib/common/src/abstractions/i18n.service"; import { LogService } from "../../jslib/common/src/abstractions/log.service"; -import { groupFixtures } from "../../openldap/group-fixtures"; -import { userFixtures } from "../../openldap/user-fixtures"; +import { getLdapConfiguration, getSyncConfiguration } from "../../utils/openldap/config-fixtures"; +import { groupFixtures } from "../../utils/openldap/group-fixtures"; +import { userFixtures } from "../../utils/openldap/user-fixtures"; import { DirectoryType } from "../enums/directoryType"; -import { getLdapConfiguration, getSyncConfiguration } from "../utils/test-fixtures"; import { LdapDirectoryService } from "./ldap-directory.service"; import { StateService } from "./state.service"; @@ -52,7 +52,7 @@ describe("ldapDirectoryService", () => { getLdapConfiguration({ ssl: true, startTls: true, - tlsCaPath: "./openldap/certs/rootCA.pem", + tlsCaPath: "./utils/openldap/certs/rootCA.pem", }), ); stateService.getSync.mockResolvedValue(getSyncConfiguration({ groups: true, users: true })); @@ -67,7 +67,7 @@ describe("ldapDirectoryService", () => { getLdapConfiguration({ port: 1636, ssl: true, - sslCaPath: "./openldap/certs/rootCA.pem", + sslCaPath: "./utils/openldap/certs/rootCA.pem", }), ); stateService.getSync.mockResolvedValue(getSyncConfiguration({ groups: true, users: true })); diff --git a/src/services/single-request-builder.spec.ts b/src/services/single-request-builder.spec.ts index 20eba07b..461d1801 100644 --- a/src/services/single-request-builder.spec.ts +++ b/src/services/single-request-builder.spec.ts @@ -2,8 +2,8 @@ import { GetUniqueString } from "@/jslib/common/spec/utils"; import { UserEntry } from "@/src/models/userEntry"; +import { groupSimulator, userSimulator } from "../../utils/request-builder-helper"; import { RequestBuilderOptions } from "../abstractions/request-builder.service"; -import { groupSimulator, userSimulator } from "../utils/request-builder-helper"; import { SingleRequestBuilder } from "./single-request-builder"; diff --git a/src/services/sync.service.integration.spec.ts b/src/services/sync.service.integration.spec.ts index 2d56f82c..e6ff2780 100644 --- a/src/services/sync.service.integration.spec.ts +++ b/src/services/sync.service.integration.spec.ts @@ -7,11 +7,9 @@ import { EnvironmentService } from "@/jslib/common/src/services/environment.serv import { I18nService } from "../../jslib/common/src/abstractions/i18n.service"; import { LogService } from "../../jslib/common/src/abstractions/log.service"; -import { groupFixtures } from "../../openldap/group-fixtures"; -import { userFixtures } from "../../openldap/user-fixtures"; +import { getLdapConfiguration, getSyncConfiguration } from "../../utils/openldap/config-fixtures"; import { DirectoryFactoryService } from "../abstractions/directory-factory.service"; import { DirectoryType } from "../enums/directoryType"; -import { getLdapConfiguration, getSyncConfiguration } from "../utils/test-fixtures"; import { BatchRequestBuilder } from "./batch-request-builder"; import { LdapDirectoryService } from "./ldap-directory.service"; @@ -20,6 +18,9 @@ import { StateService } from "./state.service"; import { SyncService } from "./sync.service"; import * as constants from "./sync.service"; +import { groupFixtures } from "@/utils/openldap/group-fixtures"; +import { userFixtures } from "@/utils/openldap/user-fixtures"; + describe("SyncService", () => { let logService: MockProxy; let i18nService: MockProxy; diff --git a/src/services/sync.service.spec.ts b/src/services/sync.service.spec.ts index b9ac26b0..726e6240 100644 --- a/src/services/sync.service.spec.ts +++ b/src/services/sync.service.spec.ts @@ -6,9 +6,9 @@ import { MessagingService } from "@/jslib/common/src/abstractions/messaging.serv import { OrganizationImportRequest } from "@/jslib/common/src/models/request/organizationImportRequest"; import { ApiService } from "@/jslib/common/src/services/api.service"; +import { getSyncConfiguration } from "../../utils/openldap/config-fixtures"; import { DirectoryFactoryService } from "../abstractions/directory-factory.service"; import { DirectoryType } from "../enums/directoryType"; -import { getSyncConfiguration } from "../utils/test-fixtures"; import { BatchRequestBuilder } from "./batch-request-builder"; import { I18nService } from "./i18n.service"; @@ -18,8 +18,8 @@ import { StateService } from "./state.service"; import { SyncService } from "./sync.service"; import * as constants from "./sync.service"; -import { groupFixtures } from "@/openldap/group-fixtures"; -import { userFixtures } from "@/openldap/user-fixtures"; +import { groupFixtures } from "@/utils/openldap/group-fixtures"; +import { userFixtures } from "@/utils/openldap/user-fixtures"; describe("SyncService", () => { let cryptoFunctionService: MockProxy; diff --git a/utils/.env.example b/utils/.env.example new file mode 100644 index 00000000..0dfb88c8 --- /dev/null +++ b/utils/.env.example @@ -0,0 +1,4 @@ +GOOGLE_DOMAIN= +GOOGLE_ADMIN_USER= +GOOGLE_CLIENT_EMAIL= +GOOGLE_PRIVATE_KEY= \ No newline at end of file diff --git a/utils/google-workspace/config-fixtures.ts b/utils/google-workspace/config-fixtures.ts new file mode 100644 index 00000000..628d10c3 --- /dev/null +++ b/utils/google-workspace/config-fixtures.ts @@ -0,0 +1,56 @@ +import { GSuiteConfiguration } from "../../src/models/gsuiteConfiguration"; +import { SyncConfiguration } from "../../src/models/syncConfiguration"; + +/** + * @returns a basic GSuite configuration. Can be overridden by passing in a partial configuration. + */ +export const getGSuiteConfiguration = ( + config?: Partial, +): GSuiteConfiguration => { + const adminUser = process.env.GOOGLE_ADMIN_USER; + const clientEmail = process.env.GOOGLE_CLIENT_EMAIL; + const privateKey = process.env.GOOGLE_PRIVATE_KEY; + const domain = process.env.GOOGLE_DOMAIN; + + if (!adminUser || !clientEmail || !privateKey || !domain) { + throw new Error("Google Workspace integration test credentials not configured."); + } + + return { + // TODO + adminUser, + clientEmail, + privateKey, + domain: domain, + customer: "", + ...(config ?? {}), + }; +}; + +/** + * @returns a basic Google Workspace sync configuration. Can be overridden by passing in a partial configuration. + */ +export const getSyncConfiguration = (config?: Partial): SyncConfiguration => ({ + users: false, + groups: false, + interval: 5, + userFilter: "", + groupFilter: "", + removeDisabled: false, + overwriteExisting: false, + largeImport: false, + // Ldap properties - not optional for some reason + groupObjectClass: "", + userObjectClass: "", + groupPath: null, + userPath: null, + groupNameAttribute: "", + userEmailAttribute: "", + memberAttribute: "", + useEmailPrefixSuffix: false, + emailPrefixAttribute: "", + emailSuffix: null, + creationDateAttribute: "", + revisionDateAttribute: "", + ...(config ?? {}), +}); diff --git a/utils/google-workspace/group-fixtures.ts b/utils/google-workspace/group-fixtures.ts new file mode 100644 index 00000000..b8266b37 --- /dev/null +++ b/utils/google-workspace/group-fixtures.ts @@ -0,0 +1,26 @@ +import { Jsonify } from "type-fest"; + +import { GroupEntry } from "../../src/models/groupEntry"; + +// These must match the Google Workspace seed data + +const data: Jsonify[] = [ + { + externalId: "0319y80a3anpxhj", + groupMemberReferenceIds: [], + name: "Integration Test Group A", + referenceId: "0319y80a3anpxhj", + userMemberExternalIds: ["111605910541641314041", "111147009830456099026"], + users: [], + }, + { + externalId: "02afmg28317uyub", + groupMemberReferenceIds: [], + name: "Integration Test Group B", + referenceId: "02afmg28317uyub", + userMemberExternalIds: ["111147009830456099026", "100150970267699397306"], + users: [], + }, +]; + +export const groupFixtures = data.map((g) => GroupEntry.fromJSON(g)); diff --git a/utils/google-workspace/user-fixtures.ts b/utils/google-workspace/user-fixtures.ts new file mode 100644 index 00000000..fa47e475 --- /dev/null +++ b/utils/google-workspace/user-fixtures.ts @@ -0,0 +1,50 @@ +import { Jsonify } from "type-fest"; + +import { UserEntry } from "../../src/models/userEntry"; + +// These must match the Google Workspace seed data + +const data: Jsonify[] = [ + // In Group A + { + deleted: false, + disabled: false, + email: "testuser1@bwrox.dev", + externalId: "111605910541641314041", + referenceId: "111605910541641314041", + }, + // In Groups A + B + { + deleted: false, + disabled: false, + email: "testuser2@bwrox.dev", + externalId: "111147009830456099026", + referenceId: "111147009830456099026", + }, + // In Group B + { + deleted: false, + disabled: false, + email: "testuser3@bwrox.dev", + externalId: "100150970267699397306", + referenceId: "100150970267699397306", + }, + // Not in a group + { + deleted: false, + disabled: false, + email: "testuser4@bwrox.dev", + externalId: "113764752650306721470", + referenceId: "113764752650306721470", + }, + // Disabled user + { + deleted: false, + disabled: true, + email: "testuser5@bwrox.dev", + externalId: "110381976819725658200", + referenceId: "110381976819725658200", + }, +]; + +export const userFixtures = data.map((g) => UserEntry.fromJSON(g)); diff --git a/src/utils/test-fixtures.ts b/utils/openldap/config-fixtures.ts similarity index 90% rename from src/utils/test-fixtures.ts rename to utils/openldap/config-fixtures.ts index d611e3e8..25e48ae0 100644 --- a/src/utils/test-fixtures.ts +++ b/utils/openldap/config-fixtures.ts @@ -1,5 +1,5 @@ -import { LdapConfiguration } from "../models/ldapConfiguration"; -import { SyncConfiguration } from "../models/syncConfiguration"; +import { LdapConfiguration } from "../../src/models/ldapConfiguration"; +import { SyncConfiguration } from "../../src/models/syncConfiguration"; /** * @returns a basic ldap configuration without TLS/SSL enabled. Can be overridden by passing in a partial configuration. diff --git a/openldap/example-ldifs/directory-100.ldif b/utils/openldap/example-ldifs/directory-100.ldif similarity index 100% rename from openldap/example-ldifs/directory-100.ldif rename to utils/openldap/example-ldifs/directory-100.ldif diff --git a/openldap/example-ldifs/directory-11000.ldif b/utils/openldap/example-ldifs/directory-11000.ldif similarity index 100% rename from openldap/example-ldifs/directory-11000.ldif rename to utils/openldap/example-ldifs/directory-11000.ldif diff --git a/openldap/example-ldifs/directory-250.ldif b/utils/openldap/example-ldifs/directory-250.ldif similarity index 100% rename from openldap/example-ldifs/directory-250.ldif rename to utils/openldap/example-ldifs/directory-250.ldif diff --git a/openldap/example-ldifs/directory-50.ldif b/utils/openldap/example-ldifs/directory-50.ldif similarity index 100% rename from openldap/example-ldifs/directory-50.ldif rename to utils/openldap/example-ldifs/directory-50.ldif diff --git a/openldap/example-ldifs/directory-500.ldif b/utils/openldap/example-ldifs/directory-500.ldif similarity index 100% rename from openldap/example-ldifs/directory-500.ldif rename to utils/openldap/example-ldifs/directory-500.ldif diff --git a/openldap/group-fixtures.ts b/utils/openldap/group-fixtures.ts similarity index 97% rename from openldap/group-fixtures.ts rename to utils/openldap/group-fixtures.ts index a6298840..ce937b36 100644 --- a/openldap/group-fixtures.ts +++ b/utils/openldap/group-fixtures.ts @@ -1,6 +1,6 @@ import { Jsonify } from "type-fest"; -import { GroupEntry } from "../src/models/groupEntry"; +import { GroupEntry } from "@/src/models/groupEntry"; // These must match the ldap server seed data in directory.ldif const data: Jsonify[] = [ diff --git a/openldap/ldifs/directory-20.ldif b/utils/openldap/ldifs/directory-20.ldif similarity index 100% rename from openldap/ldifs/directory-20.ldif rename to utils/openldap/ldifs/directory-20.ldif diff --git a/utils/openldap/mkcert.sh b/utils/openldap/mkcert.sh new file mode 100755 index 00000000..6b44349d --- /dev/null +++ b/utils/openldap/mkcert.sh @@ -0,0 +1,10 @@ +if ! [ -x "$(command -v mkcert)" ]; then + echo 'Error: mkcert is not installed. Install mkcert first and then re-run this script.' + echo 'e.g. brew install mkcert' + exit 1 +fi + +mkcert -install +mkdir -p ./utils/openldap/certs +cp "$(mkcert -CAROOT)/rootCA.pem" ./utils/openldap/certs/rootCA.pem +mkcert -key-file ./utils/openldap/certs/openldap-key.pem -cert-file ./utils/openldap/certs/openldap.pem localhost openldap diff --git a/openldap/user-fixtures.ts b/utils/openldap/user-fixtures.ts similarity index 99% rename from openldap/user-fixtures.ts rename to utils/openldap/user-fixtures.ts index d34a2eec..877a4356 100644 --- a/openldap/user-fixtures.ts +++ b/utils/openldap/user-fixtures.ts @@ -1,6 +1,6 @@ import { Jsonify } from "type-fest"; -import { UserEntry } from "../src/models/userEntry"; +import { UserEntry } from "@/src/models/userEntry"; // These must match the ldap server seed data in directory.ldif const data: Jsonify[] = [ diff --git a/src/utils/request-builder-helper.ts b/utils/request-builder-helper.ts similarity index 85% rename from src/utils/request-builder-helper.ts rename to utils/request-builder-helper.ts index f83c3321..46357d70 100644 --- a/src/utils/request-builder-helper.ts +++ b/utils/request-builder-helper.ts @@ -1,7 +1,7 @@ import { GetUniqueString } from "@/jslib/common/spec/utils"; -import { GroupEntry } from "../models/groupEntry"; -import { UserEntry } from "../models/userEntry"; +import { GroupEntry } from "../src/models/groupEntry"; +import { UserEntry } from "../src/models/userEntry"; export function userSimulator(userCount: number): UserEntry[] { const users: UserEntry[] = [];