@lhremote/cli 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/handlers/add-people-to-collection.d.ts.map +1 -1
- package/dist/handlers/add-people-to-collection.js +2 -2
- package/dist/handlers/add-people-to-collection.js.map +1 -1
- package/dist/handlers/build-url.test.d.ts +2 -0
- package/dist/handlers/build-url.test.d.ts.map +1 -0
- package/dist/handlers/build-url.test.js +119 -0
- package/dist/handlers/build-url.test.js.map +1 -0
- package/dist/handlers/campaign-add-action.d.ts.map +1 -1
- package/dist/handlers/campaign-add-action.js +2 -2
- package/dist/handlers/campaign-add-action.js.map +1 -1
- package/dist/handlers/campaign-create.d.ts.map +1 -1
- package/dist/handlers/campaign-create.js +2 -2
- package/dist/handlers/campaign-create.js.map +1 -1
- package/dist/handlers/campaign-delete.d.ts +1 -0
- package/dist/handlers/campaign-delete.d.ts.map +1 -1
- package/dist/handlers/campaign-delete.js +5 -3
- package/dist/handlers/campaign-delete.js.map +1 -1
- package/dist/handlers/campaign-delete.test.js +25 -0
- package/dist/handlers/campaign-delete.test.js.map +1 -1
- package/dist/handlers/campaign-erase.d.ts +8 -0
- package/dist/handlers/campaign-erase.d.ts.map +1 -0
- package/dist/handlers/campaign-erase.js +39 -0
- package/dist/handlers/campaign-erase.js.map +1 -0
- package/dist/handlers/campaign-erase.test.d.ts +2 -0
- package/dist/handlers/campaign-erase.test.d.ts.map +1 -0
- package/dist/handlers/campaign-erase.test.js +71 -0
- package/dist/handlers/campaign-erase.test.js.map +1 -0
- package/dist/handlers/campaign-exclude-add.d.ts.map +1 -1
- package/dist/handlers/campaign-exclude-add.js +2 -2
- package/dist/handlers/campaign-exclude-add.js.map +1 -1
- package/dist/handlers/campaign-exclude-list.d.ts.map +1 -1
- package/dist/handlers/campaign-exclude-list.js +2 -2
- package/dist/handlers/campaign-exclude-list.js.map +1 -1
- package/dist/handlers/campaign-exclude-remove.d.ts.map +1 -1
- package/dist/handlers/campaign-exclude-remove.js +2 -2
- package/dist/handlers/campaign-exclude-remove.js.map +1 -1
- package/dist/handlers/campaign-export.d.ts.map +1 -1
- package/dist/handlers/campaign-export.js +2 -2
- package/dist/handlers/campaign-export.js.map +1 -1
- package/dist/handlers/campaign-get.d.ts.map +1 -1
- package/dist/handlers/campaign-get.js +2 -2
- package/dist/handlers/campaign-get.js.map +1 -1
- package/dist/handlers/campaign-list-people.d.ts.map +1 -1
- package/dist/handlers/campaign-list-people.js +2 -2
- package/dist/handlers/campaign-list-people.js.map +1 -1
- package/dist/handlers/campaign-move-next.d.ts.map +1 -1
- package/dist/handlers/campaign-move-next.js +2 -2
- package/dist/handlers/campaign-move-next.js.map +1 -1
- package/dist/handlers/campaign-remove-action.d.ts.map +1 -1
- package/dist/handlers/campaign-remove-action.js +2 -2
- package/dist/handlers/campaign-remove-action.js.map +1 -1
- package/dist/handlers/campaign-remove-people.d.ts.map +1 -1
- package/dist/handlers/campaign-remove-people.js +2 -2
- package/dist/handlers/campaign-remove-people.js.map +1 -1
- package/dist/handlers/campaign-reorder-actions.d.ts.map +1 -1
- package/dist/handlers/campaign-reorder-actions.js +2 -2
- package/dist/handlers/campaign-reorder-actions.js.map +1 -1
- package/dist/handlers/campaign-retry.d.ts.map +1 -1
- package/dist/handlers/campaign-retry.js +2 -2
- package/dist/handlers/campaign-retry.js.map +1 -1
- package/dist/handlers/campaign-start.d.ts.map +1 -1
- package/dist/handlers/campaign-start.js +2 -2
- package/dist/handlers/campaign-start.js.map +1 -1
- package/dist/handlers/campaign-statistics.d.ts.map +1 -1
- package/dist/handlers/campaign-statistics.js +2 -2
- package/dist/handlers/campaign-statistics.js.map +1 -1
- package/dist/handlers/campaign-status.d.ts.map +1 -1
- package/dist/handlers/campaign-status.js +2 -2
- package/dist/handlers/campaign-status.js.map +1 -1
- package/dist/handlers/campaign-stop.d.ts.map +1 -1
- package/dist/handlers/campaign-stop.js +2 -2
- package/dist/handlers/campaign-stop.js.map +1 -1
- package/dist/handlers/campaign-update-action.d.ts.map +1 -1
- package/dist/handlers/campaign-update-action.js +2 -2
- package/dist/handlers/campaign-update-action.js.map +1 -1
- package/dist/handlers/campaign-update.d.ts.map +1 -1
- package/dist/handlers/campaign-update.js +2 -2
- package/dist/handlers/campaign-update.js.map +1 -1
- package/dist/handlers/check-replies.d.ts +2 -0
- package/dist/handlers/check-replies.d.ts.map +1 -1
- package/dist/handlers/check-replies.js +9 -2
- package/dist/handlers/check-replies.js.map +1 -1
- package/dist/handlers/check-replies.test.js +25 -8
- package/dist/handlers/check-replies.test.js.map +1 -1
- package/dist/handlers/check-status.d.ts.map +1 -1
- package/dist/handlers/check-status.js +6 -6
- package/dist/handlers/check-status.js.map +1 -1
- package/dist/handlers/collect-people.d.ts.map +1 -1
- package/dist/handlers/collect-people.js +2 -2
- package/dist/handlers/collect-people.js.map +1 -1
- package/dist/handlers/comment-on-post.d.ts +10 -0
- package/dist/handlers/comment-on-post.d.ts.map +1 -0
- package/dist/handlers/comment-on-post.js +37 -0
- package/dist/handlers/comment-on-post.js.map +1 -0
- package/dist/handlers/comment-on-post.test.d.ts +2 -0
- package/dist/handlers/comment-on-post.test.d.ts.map +1 -0
- package/dist/handlers/comment-on-post.test.js +75 -0
- package/dist/handlers/comment-on-post.test.js.map +1 -0
- package/dist/handlers/create-collection.d.ts.map +1 -1
- package/dist/handlers/create-collection.js +2 -2
- package/dist/handlers/create-collection.js.map +1 -1
- package/dist/handlers/delete-collection.d.ts.map +1 -1
- package/dist/handlers/delete-collection.js +2 -2
- package/dist/handlers/delete-collection.js.map +1 -1
- package/dist/handlers/dismiss-errors.d.ts +8 -0
- package/dist/handlers/dismiss-errors.d.ts.map +1 -0
- package/dist/handlers/dismiss-errors.js +28 -0
- package/dist/handlers/dismiss-errors.js.map +1 -0
- package/dist/handlers/dismiss-errors.test.d.ts +2 -0
- package/dist/handlers/dismiss-errors.test.d.ts.map +1 -0
- package/dist/handlers/dismiss-errors.test.js +90 -0
- package/dist/handlers/dismiss-errors.test.js.map +1 -0
- package/dist/handlers/endorse-skills.d.ts +14 -0
- package/dist/handlers/endorse-skills.d.ts.map +1 -0
- package/dist/handlers/endorse-skills.js +44 -0
- package/dist/handlers/endorse-skills.js.map +1 -0
- package/dist/handlers/endorse-skills.test.d.ts +2 -0
- package/dist/handlers/endorse-skills.test.d.ts.map +1 -0
- package/dist/handlers/endorse-skills.test.js +65 -0
- package/dist/handlers/endorse-skills.test.js.map +1 -0
- package/dist/handlers/enrich-profile.d.ts +16 -0
- package/dist/handlers/enrich-profile.d.ts.map +1 -0
- package/dist/handlers/enrich-profile.js +51 -0
- package/dist/handlers/enrich-profile.js.map +1 -0
- package/dist/handlers/enrich-profile.test.d.ts +2 -0
- package/dist/handlers/enrich-profile.test.d.ts.map +1 -0
- package/dist/handlers/enrich-profile.test.js +65 -0
- package/dist/handlers/enrich-profile.test.js.map +1 -0
- package/dist/handlers/find-app.js +1 -1
- package/dist/handlers/find-app.js.map +1 -1
- package/dist/handlers/find-app.test.js +4 -4
- package/dist/handlers/find-app.test.js.map +1 -1
- package/dist/handlers/follow-person.d.ts +13 -0
- package/dist/handlers/follow-person.d.ts.map +1 -0
- package/dist/handlers/follow-person.js +45 -0
- package/dist/handlers/follow-person.js.map +1 -0
- package/dist/handlers/follow-person.test.d.ts +2 -0
- package/dist/handlers/follow-person.test.d.ts.map +1 -0
- package/dist/handlers/follow-person.test.js +65 -0
- package/dist/handlers/follow-person.test.js.map +1 -0
- package/dist/handlers/get-action-budget.d.ts +8 -0
- package/dist/handlers/get-action-budget.d.ts.map +1 -0
- package/dist/handlers/get-action-budget.js +46 -0
- package/dist/handlers/get-action-budget.js.map +1 -0
- package/dist/handlers/get-action-budget.test.d.ts +2 -0
- package/dist/handlers/get-action-budget.test.d.ts.map +1 -0
- package/dist/handlers/get-action-budget.test.js +69 -0
- package/dist/handlers/get-action-budget.test.js.map +1 -0
- package/dist/handlers/get-errors.d.ts.map +1 -1
- package/dist/handlers/get-errors.js +14 -2
- package/dist/handlers/get-errors.js.map +1 -1
- package/dist/handlers/get-errors.test.js +25 -0
- package/dist/handlers/get-errors.test.js.map +1 -1
- package/dist/handlers/get-feed.d.ts +10 -0
- package/dist/handlers/get-feed.d.ts.map +1 -0
- package/dist/handlers/get-feed.js +64 -0
- package/dist/handlers/get-feed.js.map +1 -0
- package/dist/handlers/get-feed.test.d.ts +2 -0
- package/dist/handlers/get-feed.test.d.ts.map +1 -0
- package/dist/handlers/get-feed.test.js +124 -0
- package/dist/handlers/get-feed.test.js.map +1 -0
- package/dist/handlers/get-post-stats.d.ts +8 -0
- package/dist/handlers/get-post-stats.d.ts.map +1 -0
- package/dist/handlers/get-post-stats.js +37 -0
- package/dist/handlers/get-post-stats.js.map +1 -0
- package/dist/handlers/get-post-stats.test.d.ts +2 -0
- package/dist/handlers/get-post-stats.test.d.ts.map +1 -0
- package/dist/handlers/get-post-stats.test.js +79 -0
- package/dist/handlers/get-post-stats.test.js.map +1 -0
- package/dist/handlers/get-post.d.ts +9 -0
- package/dist/handlers/get-post.d.ts.map +1 -0
- package/dist/handlers/get-post.js +65 -0
- package/dist/handlers/get-post.js.map +1 -0
- package/dist/handlers/get-post.test.d.ts +2 -0
- package/dist/handlers/get-post.test.d.ts.map +1 -0
- package/dist/handlers/get-post.test.js +124 -0
- package/dist/handlers/get-post.test.js.map +1 -0
- package/dist/handlers/get-profile-activity.d.ts +10 -0
- package/dist/handlers/get-profile-activity.d.ts.map +1 -0
- package/dist/handlers/get-profile-activity.js +60 -0
- package/dist/handlers/get-profile-activity.js.map +1 -0
- package/dist/handlers/get-profile-activity.test.d.ts +2 -0
- package/dist/handlers/get-profile-activity.test.d.ts.map +1 -0
- package/dist/handlers/get-profile-activity.test.js +127 -0
- package/dist/handlers/get-profile-activity.test.js.map +1 -0
- package/dist/handlers/get-throttle-status.d.ts +8 -0
- package/dist/handlers/get-throttle-status.d.ts.map +1 -0
- package/dist/handlers/get-throttle-status.js +33 -0
- package/dist/handlers/get-throttle-status.js.map +1 -0
- package/dist/handlers/get-throttle-status.test.d.ts +2 -0
- package/dist/handlers/get-throttle-status.test.d.ts.map +1 -0
- package/dist/handlers/get-throttle-status.test.js +65 -0
- package/dist/handlers/get-throttle-status.test.js.map +1 -0
- package/dist/handlers/import-people-from-collection.d.ts.map +1 -1
- package/dist/handlers/import-people-from-collection.js +2 -2
- package/dist/handlers/import-people-from-collection.js.map +1 -1
- package/dist/handlers/import-people-from-urls.d.ts.map +1 -1
- package/dist/handlers/import-people-from-urls.js +2 -2
- package/dist/handlers/import-people-from-urls.js.map +1 -1
- package/dist/handlers/index.d.ts +20 -0
- package/dist/handlers/index.d.ts.map +1 -1
- package/dist/handlers/index.js +20 -0
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/like-person-posts.d.ts +18 -0
- package/dist/handlers/like-person-posts.d.ts.map +1 -0
- package/dist/handlers/like-person-posts.js +59 -0
- package/dist/handlers/like-person-posts.js.map +1 -0
- package/dist/handlers/like-person-posts.test.d.ts +2 -0
- package/dist/handlers/like-person-posts.test.d.ts.map +1 -0
- package/dist/handlers/like-person-posts.test.js +71 -0
- package/dist/handlers/like-person-posts.test.js.map +1 -0
- package/dist/handlers/list-accounts.d.ts.map +1 -1
- package/dist/handlers/list-accounts.js +12 -2
- package/dist/handlers/list-accounts.js.map +1 -1
- package/dist/handlers/list-accounts.test.js +3 -1
- package/dist/handlers/list-accounts.test.js.map +1 -1
- package/dist/handlers/list-reference-data.test.d.ts +2 -0
- package/dist/handlers/list-reference-data.test.d.ts.map +1 -0
- package/dist/handlers/list-reference-data.test.js +62 -0
- package/dist/handlers/list-reference-data.test.js.map +1 -0
- package/dist/handlers/message-person.d.ts +15 -0
- package/dist/handlers/message-person.d.ts.map +1 -0
- package/dist/handlers/message-person.js +65 -0
- package/dist/handlers/message-person.js.map +1 -0
- package/dist/handlers/message-person.test.d.ts +2 -0
- package/dist/handlers/message-person.test.d.ts.map +1 -0
- package/dist/handlers/message-person.test.js +77 -0
- package/dist/handlers/message-person.test.js.map +1 -0
- package/dist/handlers/query-messages.integration.test.js +24 -3
- package/dist/handlers/query-messages.integration.test.js.map +1 -1
- package/dist/handlers/react-to-post.d.ts +9 -0
- package/dist/handlers/react-to-post.d.ts.map +1 -0
- package/dist/handlers/react-to-post.js +30 -0
- package/dist/handlers/react-to-post.js.map +1 -0
- package/dist/handlers/react-to-post.test.d.ts +2 -0
- package/dist/handlers/react-to-post.test.d.ts.map +1 -0
- package/dist/handlers/react-to-post.test.js +53 -0
- package/dist/handlers/react-to-post.test.js.map +1 -0
- package/dist/handlers/remove-connection.d.ts +11 -0
- package/dist/handlers/remove-connection.d.ts.map +1 -0
- package/dist/handlers/remove-connection.js +41 -0
- package/dist/handlers/remove-connection.js.map +1 -0
- package/dist/handlers/remove-connection.test.d.ts +2 -0
- package/dist/handlers/remove-connection.test.d.ts.map +1 -0
- package/dist/handlers/remove-connection.test.js +65 -0
- package/dist/handlers/remove-connection.test.js.map +1 -0
- package/dist/handlers/remove-people-from-collection.d.ts.map +1 -1
- package/dist/handlers/remove-people-from-collection.js +2 -2
- package/dist/handlers/remove-people-from-collection.js.map +1 -1
- package/dist/handlers/resolve-entity.d.ts.map +1 -1
- package/dist/handlers/resolve-entity.js +2 -2
- package/dist/handlers/resolve-entity.js.map +1 -1
- package/dist/handlers/resolve-entity.test.d.ts +2 -0
- package/dist/handlers/resolve-entity.test.d.ts.map +1 -0
- package/dist/handlers/resolve-entity.test.js +93 -0
- package/dist/handlers/resolve-entity.test.js.map +1 -0
- package/dist/handlers/scrape-messaging-history.d.ts +1 -0
- package/dist/handlers/scrape-messaging-history.d.ts.map +1 -1
- package/dist/handlers/scrape-messaging-history.js +3 -2
- package/dist/handlers/scrape-messaging-history.js.map +1 -1
- package/dist/handlers/search-posts.d.ts +10 -0
- package/dist/handlers/search-posts.d.ts.map +1 -0
- package/dist/handlers/search-posts.js +56 -0
- package/dist/handlers/search-posts.js.map +1 -0
- package/dist/handlers/search-posts.test.d.ts +2 -0
- package/dist/handlers/search-posts.test.d.ts.map +1 -0
- package/dist/handlers/search-posts.test.js +112 -0
- package/dist/handlers/search-posts.test.js.map +1 -0
- package/dist/handlers/send-inmail.d.ts +15 -0
- package/dist/handlers/send-inmail.d.ts.map +1 -0
- package/dist/handlers/send-inmail.js +65 -0
- package/dist/handlers/send-inmail.js.map +1 -0
- package/dist/handlers/send-inmail.test.d.ts +2 -0
- package/dist/handlers/send-inmail.test.d.ts.map +1 -0
- package/dist/handlers/send-inmail.test.js +77 -0
- package/dist/handlers/send-inmail.test.js.map +1 -0
- package/dist/handlers/send-invite.d.ts +13 -0
- package/dist/handlers/send-invite.d.ts.map +1 -0
- package/dist/handlers/send-invite.js +54 -0
- package/dist/handlers/send-invite.js.map +1 -0
- package/dist/handlers/send-invite.test.d.ts +2 -0
- package/dist/handlers/send-invite.test.d.ts.map +1 -0
- package/dist/handlers/send-invite.test.js +71 -0
- package/dist/handlers/send-invite.test.js.map +1 -0
- package/dist/handlers/start-instance.d.ts.map +1 -1
- package/dist/handlers/start-instance.js +11 -2
- package/dist/handlers/start-instance.js.map +1 -1
- package/dist/handlers/start-instance.test.js +3 -1
- package/dist/handlers/start-instance.test.js.map +1 -1
- package/dist/handlers/stop-instance.d.ts.map +1 -1
- package/dist/handlers/stop-instance.js +11 -2
- package/dist/handlers/stop-instance.js.map +1 -1
- package/dist/handlers/stop-instance.test.js +3 -1
- package/dist/handlers/stop-instance.test.js.map +1 -1
- package/dist/handlers/visit-profile.d.ts +11 -0
- package/dist/handlers/visit-profile.d.ts.map +1 -0
- package/dist/handlers/visit-profile.js +93 -0
- package/dist/handlers/visit-profile.js.map +1 -0
- package/dist/handlers/visit-profile.test.d.ts +2 -0
- package/dist/handlers/visit-profile.test.d.ts.map +1 -0
- package/dist/handlers/visit-profile.test.js +169 -0
- package/dist/handlers/visit-profile.test.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +281 -37
- package/dist/program.js.map +1 -1
- package/dist/program.test.js +21 -1
- package/dist/program.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
vi.mock("@lhremote/core", async (importOriginal) => {
|
|
5
|
+
const actual = await importOriginal();
|
|
6
|
+
return {
|
|
7
|
+
...actual,
|
|
8
|
+
messagePerson: vi.fn(),
|
|
9
|
+
};
|
|
10
|
+
});
|
|
11
|
+
import { CampaignExecutionError, CampaignTimeoutError, messagePerson, } from "@lhremote/core";
|
|
12
|
+
import { handleMessagePerson } from "./message-person.js";
|
|
13
|
+
import { getStderr, getStdout } from "./testing/mock-helpers.js";
|
|
14
|
+
const MOCK_RESULT = {
|
|
15
|
+
success: true,
|
|
16
|
+
personId: 100,
|
|
17
|
+
results: [{ id: 1, actionVersionId: 1, personId: 100, result: 1, platform: null, createdAt: "2026-01-01T00:00:00Z", profile: null }],
|
|
18
|
+
};
|
|
19
|
+
describe("handleMessagePerson", () => {
|
|
20
|
+
let stdoutSpy;
|
|
21
|
+
let stderrSpy;
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
vi.clearAllMocks();
|
|
24
|
+
process.exitCode = undefined;
|
|
25
|
+
stdoutSpy = vi.spyOn(process.stdout, "write").mockReturnValue(true);
|
|
26
|
+
stderrSpy = vi.spyOn(process.stderr, "write").mockReturnValue(true);
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
vi.restoreAllMocks();
|
|
30
|
+
});
|
|
31
|
+
it("outputs JSON result on success", async () => {
|
|
32
|
+
vi.mocked(messagePerson).mockResolvedValue(MOCK_RESULT);
|
|
33
|
+
await handleMessagePerson({ personId: 100, messageTemplate: '{"type":"text","value":"Hello"}', json: true });
|
|
34
|
+
expect(process.exitCode).toBeUndefined();
|
|
35
|
+
const stdout = getStdout(stdoutSpy);
|
|
36
|
+
const parsed = JSON.parse(stdout);
|
|
37
|
+
expect(parsed.success).toBe(true);
|
|
38
|
+
expect(parsed.personId).toBe(100);
|
|
39
|
+
});
|
|
40
|
+
it("outputs human-readable result on success", async () => {
|
|
41
|
+
vi.mocked(messagePerson).mockResolvedValue(MOCK_RESULT);
|
|
42
|
+
await handleMessagePerson({ personId: 100, messageTemplate: '{"type":"text","value":"Hello"}' });
|
|
43
|
+
expect(process.exitCode).toBeUndefined();
|
|
44
|
+
expect(getStdout(stdoutSpy)).toContain("sent");
|
|
45
|
+
});
|
|
46
|
+
it("returns error when neither personId nor url provided", async () => {
|
|
47
|
+
await handleMessagePerson({ messageTemplate: '{"type":"text","value":"Hello"}' });
|
|
48
|
+
expect(process.exitCode).toBe(1);
|
|
49
|
+
expect(getStderr(stderrSpy)).toContain("Exactly one of --person-id or --url");
|
|
50
|
+
expect(messagePerson).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
it("returns error for invalid JSON in messageTemplate", async () => {
|
|
53
|
+
await handleMessagePerson({ personId: 100, messageTemplate: "not json" });
|
|
54
|
+
expect(process.exitCode).toBe(1);
|
|
55
|
+
expect(getStderr(stderrSpy)).toContain("Invalid JSON in --message-template");
|
|
56
|
+
expect(messagePerson).not.toHaveBeenCalled();
|
|
57
|
+
});
|
|
58
|
+
it("returns error for invalid JSON in subjectTemplate", async () => {
|
|
59
|
+
await handleMessagePerson({ personId: 100, messageTemplate: '{"type":"text","value":"Hello"}', subjectTemplate: "not json" });
|
|
60
|
+
expect(process.exitCode).toBe(1);
|
|
61
|
+
expect(getStderr(stderrSpy)).toContain("Invalid JSON in --subject-template");
|
|
62
|
+
expect(messagePerson).not.toHaveBeenCalled();
|
|
63
|
+
});
|
|
64
|
+
it("handles CampaignExecutionError", async () => {
|
|
65
|
+
vi.mocked(messagePerson).mockRejectedValue(new CampaignExecutionError("Person 100 not found"));
|
|
66
|
+
await handleMessagePerson({ personId: 100, messageTemplate: '{"type":"text","value":"Hello"}' });
|
|
67
|
+
expect(process.exitCode).toBe(1);
|
|
68
|
+
expect(getStderr(stderrSpy)).toContain("Person 100 not found");
|
|
69
|
+
});
|
|
70
|
+
it("handles CampaignTimeoutError", async () => {
|
|
71
|
+
vi.mocked(messagePerson).mockRejectedValue(new CampaignTimeoutError("Timed out", 42));
|
|
72
|
+
await handleMessagePerson({ personId: 100, messageTemplate: '{"type":"text","value":"Hello"}' });
|
|
73
|
+
expect(process.exitCode).toBe(1);
|
|
74
|
+
expect(getStderr(stderrSpy)).toContain("Timed out");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=message-person.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-person.test.js","sourceRoot":"","sources":["../../src/handlers/message-person.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { copyFileSync, unlinkSync } from "node:fs";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
3
6
|
import { dirname, join } from "node:path";
|
|
4
7
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
8
|
+
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi, } from "vitest";
|
|
6
9
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const
|
|
10
|
+
const FIXTURE_ORIGIN = join(__dirname, "../../../core/src/db/testing/fixture.db");
|
|
11
|
+
/**
|
|
12
|
+
* Per-suite copy of the fixture database.
|
|
13
|
+
* Avoids SQLite file-locking contention when multiple vitest
|
|
14
|
+
* workers open the same DB file in parallel.
|
|
15
|
+
*/
|
|
16
|
+
let fixturePath;
|
|
8
17
|
vi.mock("@lhremote/core", async (importOriginal) => {
|
|
9
18
|
const actual = await importOriginal();
|
|
10
19
|
return {
|
|
@@ -16,9 +25,21 @@ import { discoverAllDatabases } from "@lhremote/core";
|
|
|
16
25
|
import { handleQueryMessages } from "./query-messages.js";
|
|
17
26
|
describe("handleQueryMessages (integration)", () => {
|
|
18
27
|
const originalExitCode = process.exitCode;
|
|
28
|
+
beforeAll(() => {
|
|
29
|
+
fixturePath = join(tmpdir(), `lhremote-fixture-${randomUUID()}.db`);
|
|
30
|
+
copyFileSync(FIXTURE_ORIGIN, fixturePath);
|
|
31
|
+
});
|
|
32
|
+
afterAll(() => {
|
|
33
|
+
try {
|
|
34
|
+
unlinkSync(fixturePath);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Ignore cleanup errors
|
|
38
|
+
}
|
|
39
|
+
});
|
|
19
40
|
beforeEach(() => {
|
|
20
41
|
process.exitCode = undefined;
|
|
21
|
-
vi.mocked(discoverAllDatabases).mockReturnValue(new Map([[1,
|
|
42
|
+
vi.mocked(discoverAllDatabases).mockReturnValue(new Map([[1, fixturePath]]));
|
|
22
43
|
});
|
|
23
44
|
afterEach(() => {
|
|
24
45
|
process.exitCode = originalExitCode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-messages.integration.test.js","sourceRoot":"","sources":["../../src/handlers/query-messages.integration.test.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,
|
|
1
|
+
{"version":3,"file":"query-messages.integration.test.js","sourceRoot":"","sources":["../../src/handlers/query-messages.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Handle the {@link https://github.com/alexey-pelykh/lhremote#react-to-post | react-to-post} CLI command. */
|
|
2
|
+
export declare function handleReactToPost(postUrl: string, options: {
|
|
3
|
+
type?: string;
|
|
4
|
+
cdpPort?: number;
|
|
5
|
+
cdpHost?: string;
|
|
6
|
+
allowRemote?: boolean;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=react-to-post.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-to-post.d.ts","sourceRoot":"","sources":["../../src/handlers/react-to-post.ts"],"names":[],"mappings":"AAUA,8GAA8G;AAC9G,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { errorMessage, reactToPost, } from "@lhremote/core";
|
|
4
|
+
/** Handle the {@link https://github.com/alexey-pelykh/lhremote#react-to-post | react-to-post} CLI command. */
|
|
5
|
+
export async function handleReactToPost(postUrl, options) {
|
|
6
|
+
let result;
|
|
7
|
+
try {
|
|
8
|
+
result = await reactToPost({
|
|
9
|
+
postUrl,
|
|
10
|
+
reactionType: options.type,
|
|
11
|
+
cdpPort: options.cdpPort,
|
|
12
|
+
cdpHost: options.cdpHost,
|
|
13
|
+
allowRemote: options.allowRemote,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
const message = errorMessage(error);
|
|
18
|
+
process.stderr.write(`${message}\n`);
|
|
19
|
+
process.exitCode = 1;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (options.json) {
|
|
23
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
process.stdout.write(`Reacted to post with "${result.reactionType}"\n` +
|
|
27
|
+
` Post: ${result.postUrl}\n`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=react-to-post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-to-post.js","sourceRoot":"","sources":["../../src/handlers/react-to-post.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EACL,YAAY,EACZ,WAAW,GAGZ,MAAM,gBAAgB,CAAC;AAExB,8GAA8G;AAC9G,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,OAMC;IAED,IAAI,MAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,WAAW,CAAC;YACzB,OAAO;YACP,YAAY,EAAG,OAAO,CAAC,IAAiC;YACxD,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yBAAyB,MAAM,CAAC,YAAY,KAAK;YAC/C,WAAW,MAAM,CAAC,OAAO,IAAI,CAChC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-to-post.test.d.ts","sourceRoot":"","sources":["../../src/handlers/react-to-post.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
vi.mock("@lhremote/core", async (importOriginal) => {
|
|
5
|
+
const actual = await importOriginal();
|
|
6
|
+
return { ...actual, reactToPost: vi.fn() };
|
|
7
|
+
});
|
|
8
|
+
import { reactToPost } from "@lhremote/core";
|
|
9
|
+
import { handleReactToPost } from "./react-to-post.js";
|
|
10
|
+
import { getStderr, getStdout } from "./testing/mock-helpers.js";
|
|
11
|
+
const MOCK_RESULT = {
|
|
12
|
+
success: true,
|
|
13
|
+
postUrl: "https://www.linkedin.com/feed/update/urn:li:activity:123/",
|
|
14
|
+
reactionType: "like",
|
|
15
|
+
};
|
|
16
|
+
describe("handleReactToPost", () => {
|
|
17
|
+
const originalExitCode = process.exitCode;
|
|
18
|
+
let stdoutSpy;
|
|
19
|
+
let stderrSpy;
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
process.exitCode = undefined;
|
|
22
|
+
vi.clearAllMocks();
|
|
23
|
+
stdoutSpy = vi.spyOn(process.stdout, "write").mockReturnValue(true);
|
|
24
|
+
stderrSpy = vi.spyOn(process.stderr, "write").mockReturnValue(true);
|
|
25
|
+
});
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
process.exitCode = originalExitCode;
|
|
28
|
+
vi.restoreAllMocks();
|
|
29
|
+
});
|
|
30
|
+
it("prints JSON with --json", async () => {
|
|
31
|
+
vi.mocked(reactToPost).mockResolvedValue(MOCK_RESULT);
|
|
32
|
+
await handleReactToPost("https://www.linkedin.com/feed/update/urn:li:activity:123/", { json: true });
|
|
33
|
+
expect(process.exitCode).toBeUndefined();
|
|
34
|
+
const output = JSON.parse(getStdout(stdoutSpy));
|
|
35
|
+
expect(output.postUrl).toBe("https://www.linkedin.com/feed/update/urn:li:activity:123/");
|
|
36
|
+
expect(output.reactionType).toBe("like");
|
|
37
|
+
});
|
|
38
|
+
it("prints human-readable output", async () => {
|
|
39
|
+
vi.mocked(reactToPost).mockResolvedValue(MOCK_RESULT);
|
|
40
|
+
await handleReactToPost("https://www.linkedin.com/feed/update/urn:li:activity:123/", {});
|
|
41
|
+
expect(process.exitCode).toBeUndefined();
|
|
42
|
+
const output = getStdout(stdoutSpy);
|
|
43
|
+
expect(output).toContain('Reacted to post with "like"');
|
|
44
|
+
expect(output).toContain("https://www.linkedin.com/feed/update/urn:li:activity:123/");
|
|
45
|
+
});
|
|
46
|
+
it("sets exitCode on error", async () => {
|
|
47
|
+
vi.mocked(reactToPost).mockRejectedValue(new Error("connection refused"));
|
|
48
|
+
await handleReactToPost("https://www.linkedin.com/feed/update/urn:li:activity:123/", {});
|
|
49
|
+
expect(process.exitCode).toBe(1);
|
|
50
|
+
expect(getStderr(stderrSpy)).toContain("connection refused");
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=react-to-post.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-to-post.test.js","sourceRoot":"","sources":["../../src/handlers/react-to-post.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Handle the {@link https://github.com/alexey-pelykh/lhremote#remove-connection | remove-connection} CLI command. */
|
|
2
|
+
export declare function handleRemoveConnection(options: {
|
|
3
|
+
personId?: number;
|
|
4
|
+
url?: string;
|
|
5
|
+
keepCampaign?: boolean;
|
|
6
|
+
cdpPort?: number;
|
|
7
|
+
cdpHost?: string;
|
|
8
|
+
allowRemote?: boolean;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=remove-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-connection.d.ts","sourceRoot":"","sources":["../../src/handlers/remove-connection.ts"],"names":[],"mappings":"AAWA,sHAAsH;AACtH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { errorMessage, removeConnection, CampaignExecutionError, CampaignTimeoutError, } from "@lhremote/core";
|
|
4
|
+
/** Handle the {@link https://github.com/alexey-pelykh/lhremote#remove-connection | remove-connection} CLI command. */
|
|
5
|
+
export async function handleRemoveConnection(options) {
|
|
6
|
+
if ((options.personId == null) === (options.url == null)) {
|
|
7
|
+
process.stderr.write("Exactly one of --person-id or --url must be provided.\n");
|
|
8
|
+
process.exitCode = 1;
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
process.stderr.write("Removing connection...\n");
|
|
12
|
+
let result;
|
|
13
|
+
try {
|
|
14
|
+
result = await removeConnection({
|
|
15
|
+
personId: options.personId,
|
|
16
|
+
url: options.url,
|
|
17
|
+
keepCampaign: options.keepCampaign,
|
|
18
|
+
cdpPort: options.cdpPort,
|
|
19
|
+
cdpHost: options.cdpHost,
|
|
20
|
+
allowRemote: options.allowRemote,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error instanceof CampaignExecutionError || error instanceof CampaignTimeoutError) {
|
|
25
|
+
process.stderr.write(`${error.message}\n`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
process.stderr.write(`${errorMessage(error)}\n`);
|
|
29
|
+
}
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
process.stderr.write("Done.\n");
|
|
34
|
+
if (options.json) {
|
|
35
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
process.stdout.write(`Remove connection ${result.success ? "succeeded" : "failed"} (person #${String(result.personId)})\n`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=remove-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-connection.js","sourceRoot":"","sources":["../../src/handlers/remove-connection.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EACL,YAAY,EACZ,gBAAgB,EAEhB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAQ5C;IACC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAChF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAEjD,IAAI,MAA6B,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,gBAAgB,CAAC;YAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,sBAAsB,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YACrF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,aAAa,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9H,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-connection.test.d.ts","sourceRoot":"","sources":["../../src/handlers/remove-connection.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
vi.mock("@lhremote/core", async (importOriginal) => {
|
|
5
|
+
const actual = await importOriginal();
|
|
6
|
+
return {
|
|
7
|
+
...actual,
|
|
8
|
+
removeConnection: vi.fn(),
|
|
9
|
+
};
|
|
10
|
+
});
|
|
11
|
+
import { CampaignExecutionError, CampaignTimeoutError, removeConnection, } from "@lhremote/core";
|
|
12
|
+
import { handleRemoveConnection } from "./remove-connection.js";
|
|
13
|
+
import { getStderr, getStdout } from "./testing/mock-helpers.js";
|
|
14
|
+
const MOCK_RESULT = {
|
|
15
|
+
success: true,
|
|
16
|
+
personId: 100,
|
|
17
|
+
results: [{ id: 1, actionVersionId: 1, personId: 100, result: 1, platform: null, createdAt: "2026-01-01T00:00:00Z", profile: null }],
|
|
18
|
+
};
|
|
19
|
+
describe("handleRemoveConnection", () => {
|
|
20
|
+
let stdoutSpy;
|
|
21
|
+
let stderrSpy;
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
vi.clearAllMocks();
|
|
24
|
+
process.exitCode = undefined;
|
|
25
|
+
stdoutSpy = vi.spyOn(process.stdout, "write").mockReturnValue(true);
|
|
26
|
+
stderrSpy = vi.spyOn(process.stderr, "write").mockReturnValue(true);
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
vi.restoreAllMocks();
|
|
30
|
+
});
|
|
31
|
+
it("outputs JSON result on success", async () => {
|
|
32
|
+
vi.mocked(removeConnection).mockResolvedValue(MOCK_RESULT);
|
|
33
|
+
await handleRemoveConnection({ personId: 100, json: true });
|
|
34
|
+
expect(process.exitCode).toBeUndefined();
|
|
35
|
+
const stdout = getStdout(stdoutSpy);
|
|
36
|
+
const parsed = JSON.parse(stdout);
|
|
37
|
+
expect(parsed.success).toBe(true);
|
|
38
|
+
expect(parsed.personId).toBe(100);
|
|
39
|
+
});
|
|
40
|
+
it("outputs human-readable result on success", async () => {
|
|
41
|
+
vi.mocked(removeConnection).mockResolvedValue(MOCK_RESULT);
|
|
42
|
+
await handleRemoveConnection({ personId: 100 });
|
|
43
|
+
expect(process.exitCode).toBeUndefined();
|
|
44
|
+
expect(getStdout(stdoutSpy)).toContain("succeeded");
|
|
45
|
+
});
|
|
46
|
+
it("returns error when neither personId nor url provided", async () => {
|
|
47
|
+
await handleRemoveConnection({});
|
|
48
|
+
expect(process.exitCode).toBe(1);
|
|
49
|
+
expect(getStderr(stderrSpy)).toContain("Exactly one of --person-id or --url");
|
|
50
|
+
expect(removeConnection).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
it("handles CampaignExecutionError", async () => {
|
|
53
|
+
vi.mocked(removeConnection).mockRejectedValue(new CampaignExecutionError("Person 100 not found"));
|
|
54
|
+
await handleRemoveConnection({ personId: 100 });
|
|
55
|
+
expect(process.exitCode).toBe(1);
|
|
56
|
+
expect(getStderr(stderrSpy)).toContain("Person 100 not found");
|
|
57
|
+
});
|
|
58
|
+
it("handles CampaignTimeoutError", async () => {
|
|
59
|
+
vi.mocked(removeConnection).mockRejectedValue(new CampaignTimeoutError("Timed out", 42));
|
|
60
|
+
await handleRemoveConnection({ personId: 100 });
|
|
61
|
+
expect(process.exitCode).toBe(1);
|
|
62
|
+
expect(getStderr(stderrSpy)).toContain("Timed out");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=remove-connection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-connection.test.js","sourceRoot":"","sources":["../../src/handlers/remove-connection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-people-from-collection.d.ts","sourceRoot":"","sources":["../../src/handlers/remove-people-from-collection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"remove-people-from-collection.d.ts","sourceRoot":"","sources":["../../src/handlers/remove-people-from-collection.ts"],"names":[],"mappings":"AA6BA,8IAA8I;AAC9I,wBAAsB,gCAAgC,CACpD,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAoDf"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
3
|
import { readFileSync } from "node:fs";
|
|
4
|
-
import {
|
|
4
|
+
import { removePeopleFromCollection, errorMessage, } from "@lhremote/core";
|
|
5
5
|
function parsePersonIds(raw) {
|
|
6
6
|
return raw
|
|
7
7
|
.split(",")
|
|
@@ -55,7 +55,7 @@ export async function handleRemovePeopleFromCollection(collectionId, options) {
|
|
|
55
55
|
const result = await removePeopleFromCollection({
|
|
56
56
|
collectionId,
|
|
57
57
|
personIds,
|
|
58
|
-
cdpPort: options.cdpPort
|
|
58
|
+
cdpPort: options.cdpPort,
|
|
59
59
|
cdpHost: options.cdpHost,
|
|
60
60
|
allowRemote: options.allowRemote,
|
|
61
61
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-people-from-collection.js","sourceRoot":"","sources":["../../src/handlers/remove-people-from-collection.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"remove-people-from-collection.js","sourceRoot":"","sources":["../../src/handlers/remove-people-from-collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-entity.d.ts","sourceRoot":"","sources":["../../src/handlers/resolve-entity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolve-entity.d.ts","sourceRoot":"","sources":["../../src/handlers/resolve-entity.ts"],"names":[],"mappings":"AAeA,gHAAgH;AAChH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
-
import {
|
|
3
|
+
import { resolveLinkedInEntity, errorMessage, } from "@lhremote/core";
|
|
4
4
|
const VALID_ENTITY_TYPES = [
|
|
5
5
|
"COMPANY",
|
|
6
6
|
"GEO",
|
|
@@ -18,7 +18,7 @@ export async function handleResolveEntity(entityType, query, options) {
|
|
|
18
18
|
const result = await resolveLinkedInEntity({
|
|
19
19
|
query,
|
|
20
20
|
entityType: entityType,
|
|
21
|
-
cdpPort: options.cdpPort
|
|
21
|
+
cdpPort: options.cdpPort,
|
|
22
22
|
...(options.cdpHost !== undefined && { cdpHost: options.cdpHost }),
|
|
23
23
|
...(options.allowRemote !== undefined && { allowRemote: options.allowRemote }),
|
|
24
24
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-entity.js","sourceRoot":"","sources":["../../src/handlers/resolve-entity.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,
|
|
1
|
+
{"version":3,"file":"resolve-entity.js","sourceRoot":"","sources":["../../src/handlers/resolve-entity.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAEL,qBAAqB,EACrB,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,MAAM,kBAAkB,GAA0B;IAChD,SAAS;IACT,KAAK;IACL,QAAQ;CACT,CAAC;AAEF,gHAAgH;AAChH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,KAAa,EACb,OAMC;IAED,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAwB,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wBAAwB,UAAU,IAAI;YACpC,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACpD,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;YACzC,KAAK;YACL,UAAU,EAAE,UAAwB;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;SAC/E,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC7B,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACvE,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,KAAK,KAAK,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gBAAgB,KAAK,MAAM,UAAU,SAAS,MAAM,CAAC,QAAQ,QAAQ,CACtE,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-entity.test.d.ts","sourceRoot":"","sources":["../../src/handlers/resolve-entity.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
vi.mock("@lhremote/core", async (importOriginal) => {
|
|
5
|
+
const actual = await importOriginal();
|
|
6
|
+
return { ...actual, resolveLinkedInEntity: vi.fn() };
|
|
7
|
+
});
|
|
8
|
+
import { resolveLinkedInEntity, } from "@lhremote/core";
|
|
9
|
+
import { handleResolveEntity } from "./resolve-entity.js";
|
|
10
|
+
import { getStderr, getStdout } from "./testing/mock-helpers.js";
|
|
11
|
+
const MOCK_RESULT = {
|
|
12
|
+
matches: [
|
|
13
|
+
{ id: "urn:li:organization:1441", name: "Google", type: "COMPANY" },
|
|
14
|
+
{ id: "urn:li:organization:1442", name: "Google Cloud", type: "COMPANY" },
|
|
15
|
+
],
|
|
16
|
+
strategy: "public",
|
|
17
|
+
};
|
|
18
|
+
describe("handleResolveEntity", () => {
|
|
19
|
+
const originalExitCode = process.exitCode;
|
|
20
|
+
let stdoutSpy;
|
|
21
|
+
let stderrSpy;
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
process.exitCode = undefined;
|
|
24
|
+
vi.clearAllMocks();
|
|
25
|
+
stdoutSpy = vi.spyOn(process.stdout, "write").mockReturnValue(true);
|
|
26
|
+
stderrSpy = vi.spyOn(process.stderr, "write").mockReturnValue(true);
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
process.exitCode = originalExitCode;
|
|
30
|
+
vi.restoreAllMocks();
|
|
31
|
+
});
|
|
32
|
+
it("prints JSON with --json", async () => {
|
|
33
|
+
vi.mocked(resolveLinkedInEntity).mockResolvedValue(MOCK_RESULT);
|
|
34
|
+
await handleResolveEntity("COMPANY", "Google", { json: true });
|
|
35
|
+
expect(process.exitCode).toBeUndefined();
|
|
36
|
+
const output = JSON.parse(getStdout(stdoutSpy));
|
|
37
|
+
expect(output.matches).toHaveLength(2);
|
|
38
|
+
expect(output.strategy).toBe("public");
|
|
39
|
+
expect(output.matches[0].name).toBe("Google");
|
|
40
|
+
});
|
|
41
|
+
it("prints human-readable output with matches", async () => {
|
|
42
|
+
vi.mocked(resolveLinkedInEntity).mockResolvedValue(MOCK_RESULT);
|
|
43
|
+
await handleResolveEntity("COMPANY", "Google", {});
|
|
44
|
+
expect(process.exitCode).toBeUndefined();
|
|
45
|
+
const output = getStdout(stdoutSpy);
|
|
46
|
+
expect(output).toContain('"Google"');
|
|
47
|
+
expect(output).toContain("COMPANY");
|
|
48
|
+
expect(output).toContain("public");
|
|
49
|
+
expect(output).toContain("urn:li:organization:1441");
|
|
50
|
+
expect(output).toContain("Google Cloud");
|
|
51
|
+
});
|
|
52
|
+
it("sets exitCode 1 for invalid entity type", async () => {
|
|
53
|
+
await handleResolveEntity("INVALID", "Google", {});
|
|
54
|
+
expect(process.exitCode).toBe(1);
|
|
55
|
+
expect(getStderr(stderrSpy)).toContain("Unknown entity type");
|
|
56
|
+
expect(resolveLinkedInEntity).not.toHaveBeenCalled();
|
|
57
|
+
});
|
|
58
|
+
it("prints no-matches message when empty", async () => {
|
|
59
|
+
vi.mocked(resolveLinkedInEntity).mockResolvedValue({
|
|
60
|
+
matches: [],
|
|
61
|
+
strategy: "public",
|
|
62
|
+
});
|
|
63
|
+
await handleResolveEntity("COMPANY", "xyznonexistent", {});
|
|
64
|
+
expect(process.exitCode).toBeUndefined();
|
|
65
|
+
const output = getStdout(stdoutSpy);
|
|
66
|
+
expect(output).toContain("No matches found");
|
|
67
|
+
});
|
|
68
|
+
it("limits output when --limit is provided", async () => {
|
|
69
|
+
vi.mocked(resolveLinkedInEntity).mockResolvedValue(MOCK_RESULT);
|
|
70
|
+
await handleResolveEntity("COMPANY", "Google", { limit: 1 });
|
|
71
|
+
expect(process.exitCode).toBeUndefined();
|
|
72
|
+
const output = getStdout(stdoutSpy);
|
|
73
|
+
expect(output).toContain("Google");
|
|
74
|
+
expect(output).not.toContain("Google Cloud");
|
|
75
|
+
});
|
|
76
|
+
it("limits JSON output when --limit is provided", async () => {
|
|
77
|
+
vi.mocked(resolveLinkedInEntity).mockResolvedValue(MOCK_RESULT);
|
|
78
|
+
await handleResolveEntity("COMPANY", "Google", {
|
|
79
|
+
json: true,
|
|
80
|
+
limit: 1,
|
|
81
|
+
});
|
|
82
|
+
const output = JSON.parse(getStdout(stdoutSpy));
|
|
83
|
+
expect(output.matches).toHaveLength(1);
|
|
84
|
+
expect(output.matches[0].name).toBe("Google");
|
|
85
|
+
});
|
|
86
|
+
it("sets exitCode on error", async () => {
|
|
87
|
+
vi.mocked(resolveLinkedInEntity).mockRejectedValue(new Error("connection refused"));
|
|
88
|
+
await handleResolveEntity("COMPANY", "Google", {});
|
|
89
|
+
expect(process.exitCode).toBe(1);
|
|
90
|
+
expect(getStderr(stderrSpy)).toContain("connection refused");
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=resolve-entity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-entity.test.js","sourceRoot":"","sources":["../../src/handlers/resolve-entity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Handle the {@link https://github.com/alexey-pelykh/lhremote#profiles--messaging | scrape-messaging-history} CLI command. */
|
|
2
2
|
export declare function handleScrapeMessagingHistory(options: {
|
|
3
3
|
personId: number[];
|
|
4
|
+
pauseOthers?: boolean;
|
|
4
5
|
cdpPort?: number;
|
|
5
6
|
cdpHost?: string;
|
|
6
7
|
allowRemote?: boolean;
|