Skip to content

Commit 2723827

Browse files
ksalihuBuqeta
andauthored
TA-4746: Add command to find staging node dependencies of a single node (#293)
Co-authored-by: Buqeta <73654883+Buqeta@users.noreply.github.com>
1 parent 1d0f57a commit 2723827

File tree

5 files changed

+146
-5
lines changed

5 files changed

+146
-5
lines changed

DOCUMENTATION.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -955,9 +955,9 @@ The JSON file contains the complete node diff information including the change t
955955

956956
#### Listing node dependencies
957957

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

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

984+
##### List dependencies of a staging node
985+
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:
986+
```
987+
content-cli config nodes dependencies list --packageKey <packageKey> --nodeKey <nodeKey>
988+
```
989+
990+
For example, to list dependencies of a node in its current staging state:
991+
```
992+
content-cli config nodes dependencies list --packageKey my-package --nodeKey my-node
993+
```
994+
984995
##### Export node dependencies as JSON
985996
To export the node dependencies as a JSON file instead of displaying them in the console, use the `--json` option:
986997
```
987998
content-cli config nodes dependencies list --packageKey <packageKey> --nodeKey <nodeKey> --packageVersion <version> --json
988999
```
9891000

1001+
Or for staging dependencies:
1002+
```
1003+
content-cli config nodes dependencies list --packageKey <packageKey> --nodeKey <nodeKey> --json
1004+
```
1005+
9901006
This will create a JSON file in the current working directory with a UUID filename:
9911007
```
9921008
info: File downloaded successfully. New filename: 9560f81f-f746-4117-83ee-dd1f614ad624.json

src/commands/configuration-management/api/node-dependency-api.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,15 @@ export class NodeDependencyApi {
1010
this.httpClient = () => context.httpClient;
1111
}
1212

13-
public async findAll(packageKey: string, nodeKey: string, version: string): Promise<NodeDependencyTransport[]> {
13+
public async findAllStaging(packageKey: string, nodeKey: string): Promise<NodeDependencyTransport[]> {
14+
return this.httpClient()
15+
.get(`/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`)
16+
.catch((e) => {
17+
throw new FatalError(`Problem finding dependencies for node ${nodeKey} in package ${packageKey}: ${e}`);
18+
});
19+
}
20+
21+
public async findAllByVersion(packageKey: string, nodeKey: string, version: string): Promise<NodeDependencyTransport[]> {
1422
const queryParams = new URLSearchParams();
1523
queryParams.set("version", version);
1624

src/commands/configuration-management/module.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class Module extends IModule {
120120
.description("List dependencies of a specific node in a package")
121121
.requiredOption("--packageKey <packageKey>", "Identifier of the package")
122122
.requiredOption("--nodeKey <nodeKey>", "Identifier of the node")
123-
.requiredOption("--packageVersion <packageVersion>", "Version of the package")
123+
.option("--packageVersion <packageVersion>", "Version of the package. If not sent, the staging state of the package will be used.")
124124
.option("--json", "Return the response as a JSON file")
125125
.action(this.listNodeDependencies);
126126

@@ -188,6 +188,9 @@ class Module extends IModule {
188188
}
189189

190190
private async listNodeDependencies(context: Context, command: Command, options: OptionValues): Promise<void> {
191+
if (options.packageVersion === "") {
192+
throw new Error("Please specify a valid package version");
193+
}
191194
await new NodeDependencyService(context).listNodeDependencies(options.packageKey, options.nodeKey, options.packageVersion, options.json);
192195
}
193196
}

src/commands/configuration-management/node-dependency.service.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@ export class NodeDependencyService {
1313
}
1414

1515
public async listNodeDependencies(packageKey: string, nodeKey: string, version: string, jsonResponse: boolean): Promise<void> {
16-
const dependencies: NodeDependencyTransport[] = await this.nodeDependencyApi.findAll(packageKey, nodeKey, version);
16+
let dependencies : NodeDependencyTransport[];
17+
18+
if (version) {
19+
dependencies = await this.nodeDependencyApi.findAllByVersion(packageKey, nodeKey, version);
20+
} else {
21+
dependencies = await this.nodeDependencyApi.findAllStaging(packageKey, nodeKey);
22+
}
1723

1824
if (jsonResponse) {
1925
const filename = uuidv4() + ".json";

tests/commands/configuration-management/config-node-dependency.spec.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,5 +122,113 @@ describe("Node Dependencies", () => {
122122
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("Found 1 dependency:");
123123
expect(loggingTestTransport.logMessages[1].message).toContain(JSON.stringify(singleDependency[0]));
124124
});
125+
126+
describe("Staging dependencies - when version is not provided", () => {
127+
it("Should list staging node dependencies and display in console", async () => {
128+
mockAxiosGet(
129+
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
130+
dependencies
131+
);
132+
133+
await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, false);
134+
135+
expect(loggingTestTransport.logMessages.length).toBe(4);
136+
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("Found 3 dependencies:");
137+
expect(loggingTestTransport.logMessages[1].message).toContain(JSON.stringify(dependencies[0]));
138+
expect(loggingTestTransport.logMessages[2].message).toContain(JSON.stringify(dependencies[1]));
139+
expect(loggingTestTransport.logMessages[3].message).toContain(JSON.stringify(dependencies[2]));
140+
});
141+
142+
it("Should list staging node dependencies and return as JSON", async () => {
143+
mockAxiosGet(
144+
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
145+
dependencies
146+
);
147+
148+
await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, true);
149+
150+
const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1];
151+
152+
expect(mockWriteFileSync).toHaveBeenCalledWith(
153+
path.resolve(process.cwd(), expectedFileName),
154+
expect.any(String),
155+
{ encoding: "utf-8" }
156+
);
157+
158+
const dependenciesTransport = JSON.parse(mockWriteFileSync.mock.calls[0][1]) as NodeDependencyTransport[];
159+
160+
expect(dependenciesTransport).toEqual(dependencies);
161+
});
162+
163+
it("Should handle empty staging dependencies list in console output", async () => {
164+
const emptyDependencies: NodeDependencyTransport[] = [];
165+
166+
mockAxiosGet(
167+
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
168+
emptyDependencies
169+
);
170+
171+
await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, false);
172+
173+
expect(loggingTestTransport.logMessages.length).toBe(1);
174+
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("No dependencies found for this node.");
175+
});
176+
177+
it("Should handle empty staging dependencies list in JSON output", async () => {
178+
const emptyDependencies: NodeDependencyTransport[] = [];
179+
180+
mockAxiosGet(
181+
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
182+
emptyDependencies
183+
);
184+
185+
await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, true);
186+
187+
const expectedFileName = loggingTestTransport.logMessages[0].message.split(FileService.fileDownloadedMessage)[1];
188+
189+
expect(mockWriteFileSync).toHaveBeenCalledWith(
190+
path.resolve(process.cwd(), expectedFileName),
191+
expect.any(String),
192+
{ encoding: "utf-8" }
193+
);
194+
195+
const dependenciesTransport = JSON.parse(mockWriteFileSync.mock.calls[0][1]) as NodeDependencyTransport[];
196+
197+
expect(dependenciesTransport).toEqual([]);
198+
});
199+
200+
it("Should list single staging node dependency", async () => {
201+
const singleDependency: NodeDependencyTransport[] = [
202+
{
203+
packageKey: "staging-dependency-package",
204+
key: "staging-dependency-key",
205+
type: "ANALYSIS",
206+
},
207+
];
208+
209+
mockAxiosGet(
210+
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
211+
singleDependency
212+
);
213+
214+
await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, null, false);
215+
216+
expect(loggingTestTransport.logMessages.length).toBe(2);
217+
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("Found 1 dependency:");
218+
expect(loggingTestTransport.logMessages[1].message).toContain(JSON.stringify(singleDependency[0]));
219+
});
220+
221+
it("Should handle undefined version (same as null)", async () => {
222+
mockAxiosGet(
223+
`https://myTeam.celonis.cloud/pacman/api/core/staging/packages/${packageKey}/nodes/${nodeKey}/dependencies`,
224+
dependencies
225+
);
226+
227+
await new NodeDependencyService(testContext).listNodeDependencies(packageKey, nodeKey, undefined, false);
228+
229+
expect(loggingTestTransport.logMessages.length).toBe(4);
230+
expect(loggingTestTransport.logMessages[0].message.trim()).toBe("Found 3 dependencies:");
231+
});
232+
});
125233
});
126234

0 commit comments

Comments
 (0)