Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions DOCUMENTATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -955,9 +955,9 @@ The JSON file contains the complete node diff information including the change t

#### Listing node dependencies

The **config nodes dependencies list** command allows you to retrieve all dependencies of a specific node within a package version.
The **config nodes dependencies list** command allows you to retrieve all dependencies of a specific node within a package.

##### List dependencies of a node
##### List dependencies of a versioned node
To list all dependencies of a node in a specific package version, use the following command:
```
content-cli config nodes dependencies list --packageKey <packageKey> --nodeKey <nodeKey> --packageVersion <version>
Expand All @@ -981,12 +981,28 @@ If no dependencies are found, the command will display:
info: No dependencies found for this node.
```

##### List dependencies of a staging node
The `--packageVersion` parameter is optional. When omitted, the command will retrieve dependencies from the staging (draft) version of the node instead of a published version:
```
content-cli config nodes dependencies list --packageKey <packageKey> --nodeKey <nodeKey>
```

For example, to list dependencies of a node in its current staging state:
```
content-cli config nodes dependencies list --packageKey my-package --nodeKey my-node
```

##### Export node dependencies as JSON
To export the node dependencies as a JSON file instead of displaying them in the console, use the `--json` option:
```
content-cli config nodes dependencies list --packageKey <packageKey> --nodeKey <nodeKey> --packageVersion <version> --json
```

Or for staging dependencies:
```
content-cli config nodes dependencies list --packageKey <packageKey> --nodeKey <nodeKey> --json
```

This will create a JSON file in the current working directory with a UUID filename:
```
info: File downloaded successfully. New filename: 9560f81f-f746-4117-83ee-dd1f614ad624.json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,15 @@ export class NodeDependencyApi {
this.httpClient = () => context.httpClient;
}

public async findAll(packageKey: string, nodeKey: string, version: string): Promise<NodeDependencyTransport[]> {
public async findAllStaging(packageKey: string, nodeKey: string): Promise<NodeDependencyTransport[]> {
return this.httpClient()
.get(`/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`)
.catch((e) => {
throw new FatalError(`Problem finding dependencies for node ${nodeKey} in package ${packageKey}: ${e}`);
});
}

public async findAllByVersion(packageKey: string, nodeKey: string, version: string): Promise<NodeDependencyTransport[]> {
const queryParams = new URLSearchParams();
queryParams.set("version", version);

Expand Down
5 changes: 4 additions & 1 deletion src/commands/configuration-management/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ class Module extends IModule {
.description("List dependencies of a specific node in a package")
.requiredOption("--packageKey <packageKey>", "Identifier of the package")
.requiredOption("--nodeKey <nodeKey>", "Identifier of the node")
.requiredOption("--packageVersion <packageVersion>", "Version of the package")
.option("--packageVersion <packageVersion>", "Version of the package")
.option("--json", "Return the response as a JSON file")
.action(this.listNodeDependencies);

Expand Down Expand Up @@ -188,6 +188,9 @@ class Module extends IModule {
}

private async listNodeDependencies(context: Context, command: Command, options: OptionValues): Promise<void> {
if (options.packageVersion === "") {
throw new Error("Please specify a valid package version");
}
await new NodeDependencyService(context).listNodeDependencies(options.packageKey, options.nodeKey, options.packageVersion, options.json);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@ export class NodeDependencyService {
}

public async listNodeDependencies(packageKey: string, nodeKey: string, version: string, jsonResponse: boolean): Promise<void> {
const dependencies: NodeDependencyTransport[] = await this.nodeDependencyApi.findAll(packageKey, nodeKey, version);
let dependencies : NodeDependencyTransport[];

if (version) {
dependencies = await this.nodeDependencyApi.findAllByVersion(packageKey, nodeKey, version);
} else {
dependencies = await this.nodeDependencyApi.findAllStaging(packageKey, nodeKey);
}

if (jsonResponse) {
const filename = uuidv4() + ".json";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,5 +122,113 @@ describe("Node Dependencies", () => {
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("Found 1 dependency:");
expect(loggingTestTransport.logMessages[1].message).toContain(JSON.stringify(singleDependency[0]));
});

describe("Staging dependencies - when version is not provided", () => {
it("Should list staging node dependencies and display in console", async () => {
mockAxiosGet(
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
dependencies
);

await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, false);

expect(loggingTestTransport.logMessages.length).toBe(4);
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("Found 3 dependencies:");
expect(loggingTestTransport.logMessages[1].message).toContain(JSON.stringify(dependencies[0]));
expect(loggingTestTransport.logMessages[2].message).toContain(JSON.stringify(dependencies[1]));
expect(loggingTestTransport.logMessages[3].message).toContain(JSON.stringify(dependencies[2]));
});

it("Should list staging node dependencies and return as JSON", async () => {
mockAxiosGet(
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
dependencies
);

await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, true);

const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1];

expect(mockWriteFileSync).toHaveBeenCalledWith(
path.resolve(process.cwd(), expectedFileName),
expect.any(String),
{ encoding: "utf-8" }
);

const dependenciesTransport = JSON.parse(mockWriteFileSync.mock.calls[0][1]) as NodeDependencyTransport[];

expect(dependenciesTransport).toEqual(dependencies);
});

it("Should handle empty staging dependencies list in console output", async () => {
const emptyDependencies: NodeDependencyTransport[] = [];

mockAxiosGet(
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
emptyDependencies
);

await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, false);

expect(loggingTestTransport.logMessages.length).toBe(1);
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("No dependencies found for this node.");
});

it("Should handle empty staging dependencies list in JSON output", async () => {
const emptyDependencies: NodeDependencyTransport[] = [];

mockAxiosGet(
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
emptyDependencies
);

await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, true);

const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1];

expect(mockWriteFileSync).toHaveBeenCalledWith(
path.resolve(process.cwd(), expectedFileName),
expect.any(String),
{ encoding: "utf-8" }
);

const dependenciesTransport = JSON.parse(mockWriteFileSync.mock.calls[0][1]) as NodeDependencyTransport[];

expect(dependenciesTransport).toEqual([]);
});

it("Should list single staging node dependency", async () => {
const singleDependency: NodeDependencyTransport[] = [
{
packageKey: "staging-dependency-package",
key: "staging-dependency-key",
type: "ANALYSIS",
},
];

mockAxiosGet(
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
singleDependency
);

await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, false);

expect(loggingTestTransport.logMessages.length).toBe(2);
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("Found 1 dependency:");
expect(loggingTestTransport.logMessages[1].message).toContain(JSON.stringify(singleDependency[0]));
});

it("Should handle undefined version (same as null)", async () => {
mockAxiosGet(
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
dependencies
);

await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, undefined, false);

expect(loggingTestTransport.logMessages.length).toBe(4);
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("Found 3 dependencies:");
});
});
});

Loading