opensoma 0.6.0 → 0.7.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/package.json +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +6 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/client.d.ts +4 -0
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +6 -0
- package/dist/src/client.js.map +1 -1
- package/dist/src/commands/index.d.ts +1 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +1 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/toz.d.ts +16 -0
- package/dist/src/commands/toz.d.ts.map +1 -0
- package/dist/src/commands/toz.js +488 -0
- package/dist/src/commands/toz.js.map +1 -0
- package/dist/src/credential-manager.d.ts +8 -2
- package/dist/src/credential-manager.d.ts.map +1 -1
- package/dist/src/credential-manager.js +25 -3
- package/dist/src/credential-manager.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/session-recovery.js +2 -0
- package/dist/src/session-recovery.js.map +1 -1
- package/dist/src/toz-client.d.ts +89 -0
- package/dist/src/toz-client.d.ts.map +1 -0
- package/dist/src/toz-client.js +204 -0
- package/dist/src/toz-client.js.map +1 -0
- package/dist/src/toz-pending-store.d.ts +30 -0
- package/dist/src/toz-pending-store.d.ts.map +1 -0
- package/dist/src/toz-pending-store.js +36 -0
- package/dist/src/toz-pending-store.js.map +1 -0
- package/package.json +1 -1
- package/src/cli.ts +6 -3
- package/src/client.ts +10 -0
- package/src/commands/helpers.test.ts +4 -0
- package/src/commands/index.ts +1 -0
- package/src/commands/toz.test.ts +51 -0
- package/src/commands/toz.ts +607 -0
- package/src/credential-manager.test.ts +54 -0
- package/src/credential-manager.ts +26 -3
- package/src/index.ts +13 -0
- package/src/session-recovery.ts +2 -0
- package/src/toz-client.test.ts +243 -0
- package/src/toz-client.ts +311 -0
- package/src/toz-pending-store.test.ts +91 -0
- package/src/toz-pending-store.ts +62 -0
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAQtG,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAQtG,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAWxC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,cAAc,kBAAkB,CAAA;AAChC,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA"}
|
|
@@ -28,6 +28,8 @@ function buildRefreshedCredentials(credentials, identity, http) {
|
|
|
28
28
|
csrfToken,
|
|
29
29
|
username: identity.userId || credentials.username,
|
|
30
30
|
password: credentials.password,
|
|
31
|
+
tozName: credentials.tozName,
|
|
32
|
+
tozPhone: credentials.tozPhone,
|
|
31
33
|
loggedInAt: new Date().toISOString(),
|
|
32
34
|
};
|
|
33
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-recovery.js","sourceRoot":"","sources":["../../src/session-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAqB,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAMpD,MAAM,UAAU,iBAAiB,CAAC,WAAwB;IAIxD,OAAO,OAAO,CAAC,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAwB,EACxB,UAA2B,IAAI,iBAAiB,EAAE,EAClD,aAAgC,GAAG,EAAE,CAAC,IAAI,QAAQ,EAAE;IAEpD,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;IACzB,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;IAE5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACnF,MAAM,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAClD,OAAO,oBAAoB,CAAA;AAC7B,CAAC;AAED,SAAS,yBAAyB,CAChC,WAAiE,EACjE,QAAsB,EACtB,IAAyD;IAEzD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IAErC,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IAED,OAAO;QACL,aAAa;QACb,SAAS;QACT,QAAQ,EAAE,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,QAAQ;QACjD,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"session-recovery.js","sourceRoot":"","sources":["../../src/session-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAqB,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAMpD,MAAM,UAAU,iBAAiB,CAAC,WAAwB;IAIxD,OAAO,OAAO,CAAC,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAwB,EACxB,UAA2B,IAAI,iBAAiB,EAAE,EAClD,aAAgC,GAAG,EAAE,CAAC,IAAI,QAAQ,EAAE;IAEpD,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;IACzB,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;IAE5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IACnF,MAAM,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAClD,OAAO,oBAAoB,CAAA;AAC7B,CAAC;AAED,SAAS,yBAAyB,CAChC,WAAiE,EACjE,QAAsB,EACtB,IAAyD;IAEzD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IAErC,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IAED,OAAO;QACL,aAAa;QACb,SAAS;QACT,QAAQ,EAAE,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,QAAQ;QACjD,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { TozHttp, type TozHttpOptions } from './toz-http.js';
|
|
2
|
+
import type { TozBooth, TozBranch, TozDuration, TozMeeting, TozReservation, TozReserved } from './types.js';
|
|
3
|
+
export interface TozAvailabilityQuery {
|
|
4
|
+
date: string;
|
|
5
|
+
startTime: string;
|
|
6
|
+
durationMinutes: number;
|
|
7
|
+
userCount: number;
|
|
8
|
+
branchIds: readonly number[];
|
|
9
|
+
}
|
|
10
|
+
export interface TozCheckQuery {
|
|
11
|
+
date: string;
|
|
12
|
+
startTimes: readonly string[];
|
|
13
|
+
durationMinutes: number;
|
|
14
|
+
userCount: number;
|
|
15
|
+
branchIds: readonly number[];
|
|
16
|
+
}
|
|
17
|
+
export interface TozCheckResult {
|
|
18
|
+
startTime: string;
|
|
19
|
+
booths: TozBooth[];
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface TozReserveBoothArgs {
|
|
23
|
+
date: string;
|
|
24
|
+
startTime: string;
|
|
25
|
+
durationMinutes: number;
|
|
26
|
+
userCount: number;
|
|
27
|
+
boothId: number;
|
|
28
|
+
}
|
|
29
|
+
export interface TozConfirmArgs {
|
|
30
|
+
reservationId: string;
|
|
31
|
+
date: string;
|
|
32
|
+
startTime: string;
|
|
33
|
+
durationMinutes: number;
|
|
34
|
+
name: string;
|
|
35
|
+
phone: string;
|
|
36
|
+
email: string;
|
|
37
|
+
pinNum: string;
|
|
38
|
+
meetingId?: number;
|
|
39
|
+
newMeetingName?: string;
|
|
40
|
+
memo?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface TozSearchArgs {
|
|
43
|
+
name?: string;
|
|
44
|
+
phone?: string;
|
|
45
|
+
startDate?: string;
|
|
46
|
+
endDate?: string;
|
|
47
|
+
meetingName?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface TozCancelArgs {
|
|
50
|
+
reservationId: number;
|
|
51
|
+
name?: string;
|
|
52
|
+
phone?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface TozClientOptions extends TozHttpOptions {
|
|
55
|
+
name?: string;
|
|
56
|
+
phone?: string;
|
|
57
|
+
}
|
|
58
|
+
export declare class TozClient {
|
|
59
|
+
readonly http: TozHttp;
|
|
60
|
+
readonly identity: {
|
|
61
|
+
name?: string;
|
|
62
|
+
phone?: string;
|
|
63
|
+
};
|
|
64
|
+
constructor(options?: TozClientOptions);
|
|
65
|
+
branches(): Promise<TozBranch[]>;
|
|
66
|
+
meetings(): Promise<TozMeeting[]>;
|
|
67
|
+
durations(date: string, startTime: string): Promise<TozDuration[]>;
|
|
68
|
+
available(query: TozAvailabilityQuery): Promise<TozBooth[]>;
|
|
69
|
+
check(query: TozCheckQuery): Promise<TozCheckResult[]>;
|
|
70
|
+
reserveBooth(args: TozReserveBoothArgs): Promise<TozReserved>;
|
|
71
|
+
skipEquipment(args: {
|
|
72
|
+
reservationId: string;
|
|
73
|
+
date: string;
|
|
74
|
+
startTime: string;
|
|
75
|
+
durationMinutes: number;
|
|
76
|
+
}): Promise<void>;
|
|
77
|
+
sendOtp(phone?: string): Promise<void>;
|
|
78
|
+
confirm(args: TozConfirmArgs): Promise<{
|
|
79
|
+
resultMsg: string;
|
|
80
|
+
isLargeBooth: boolean;
|
|
81
|
+
}>;
|
|
82
|
+
destroyHold(): Promise<void>;
|
|
83
|
+
myReservations(args?: TozSearchArgs): Promise<TozReservation[]>;
|
|
84
|
+
cancel(args: TozCancelArgs): Promise<void>;
|
|
85
|
+
private requireName;
|
|
86
|
+
private requirePhone;
|
|
87
|
+
private mypageLogin;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=toz-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toz-client.d.ts","sourceRoot":"","sources":["../../src/toz-client.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAExG,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7B,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,QAAQ,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;gBAExC,OAAO,GAAE,gBAAqB;IAMpC,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKhC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAKjC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAWlE,SAAS,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAa3D,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAoCtD,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAiB7D,aAAa,CAAC,IAAI,EAAE;QACxB,aAAa,EAAE,MAAM,CAAA;QACrB,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,eAAe,EAAE,MAAM,CAAA;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBX,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;IAkCpF,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,cAAc,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAkBnE,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;YAMN,WAAW;CAY1B"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { assertDurationInRange, buildBranchIdsParam, buildStartTimeParam, formatDuration, formatPhone, parseEmail, parsePhone, } from './shared/utils/toz.js';
|
|
2
|
+
import { isReservationConfirmSuccess, parseBookingPageBranches, parseBookingPageMeetings, parseMypageReservations, parseTozBoothes, parseTozDurations, parseTozReserved, } from './toz-formatters.js';
|
|
3
|
+
import { TozHttp } from './toz-http.js';
|
|
4
|
+
export class TozClient {
|
|
5
|
+
http;
|
|
6
|
+
identity;
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
const { name, phone, ...httpOptions } = options;
|
|
9
|
+
this.http = new TozHttp(httpOptions);
|
|
10
|
+
this.identity = { name, phone };
|
|
11
|
+
}
|
|
12
|
+
async branches() {
|
|
13
|
+
await this.http.bootstrap();
|
|
14
|
+
return parseBookingPageBranches(await this.http.get('/booking.htm'));
|
|
15
|
+
}
|
|
16
|
+
async meetings() {
|
|
17
|
+
await this.http.bootstrap();
|
|
18
|
+
return parseBookingPageMeetings(await this.http.get('/booking.htm'));
|
|
19
|
+
}
|
|
20
|
+
async durations(date, startTime) {
|
|
21
|
+
await this.http.bootstrap();
|
|
22
|
+
const param = buildStartTimeParam(startTime);
|
|
23
|
+
const json = await this.http.postJson('/ajaxCheckDurationTime.htm', {
|
|
24
|
+
basedate: date,
|
|
25
|
+
hour: param.slice(0, 2),
|
|
26
|
+
minute: param.slice(2, 4),
|
|
27
|
+
});
|
|
28
|
+
return parseTozDurations(json);
|
|
29
|
+
}
|
|
30
|
+
async available(query) {
|
|
31
|
+
assertDurationInRange(query.durationMinutes);
|
|
32
|
+
await this.http.bootstrap();
|
|
33
|
+
const json = await this.http.postJson('/ajaxGetEnableBoothes.htm', {
|
|
34
|
+
basedate: query.date,
|
|
35
|
+
starttime: buildStartTimeParam(query.startTime),
|
|
36
|
+
durationTime: formatDuration(query.durationMinutes),
|
|
37
|
+
userCount: String(query.userCount),
|
|
38
|
+
branchIds: buildBranchIdsParam(query.branchIds),
|
|
39
|
+
});
|
|
40
|
+
return parseTozBoothes(json);
|
|
41
|
+
}
|
|
42
|
+
async check(query) {
|
|
43
|
+
if (query.startTimes.length === 0) {
|
|
44
|
+
throw new Error('toz check requires at least one --time. For a single slot, use `toz available` instead.');
|
|
45
|
+
}
|
|
46
|
+
if (query.startTimes.length > 6) {
|
|
47
|
+
throw new Error('Too many times (max 6 per invocation). Consider `toz available` for a single slot, or split into multiple invocations.');
|
|
48
|
+
}
|
|
49
|
+
assertDurationInRange(query.durationMinutes);
|
|
50
|
+
await this.http.bootstrap();
|
|
51
|
+
const results = [];
|
|
52
|
+
for (let i = 0; i < query.startTimes.length; i += 1) {
|
|
53
|
+
const startTime = query.startTimes[i];
|
|
54
|
+
try {
|
|
55
|
+
const booths = await this.available({
|
|
56
|
+
date: query.date,
|
|
57
|
+
startTime,
|
|
58
|
+
durationMinutes: query.durationMinutes,
|
|
59
|
+
userCount: query.userCount,
|
|
60
|
+
branchIds: query.branchIds,
|
|
61
|
+
});
|
|
62
|
+
results.push({ startTime, booths });
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
results.push({
|
|
66
|
+
startTime,
|
|
67
|
+
booths: [],
|
|
68
|
+
error: error instanceof Error ? error.message : String(error),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (i < query.startTimes.length - 1)
|
|
72
|
+
await sleep(500);
|
|
73
|
+
}
|
|
74
|
+
return results;
|
|
75
|
+
}
|
|
76
|
+
async reserveBooth(args) {
|
|
77
|
+
assertDurationInRange(args.durationMinutes);
|
|
78
|
+
await this.http.bootstrap();
|
|
79
|
+
const json = await this.http.postJson('/ajaxReservationBooth.htm', {
|
|
80
|
+
basedate: args.date,
|
|
81
|
+
starttime: buildStartTimeParam(args.startTime),
|
|
82
|
+
durationTime: formatDuration(args.durationMinutes),
|
|
83
|
+
userCount: String(args.userCount),
|
|
84
|
+
booth_id: String(args.boothId),
|
|
85
|
+
});
|
|
86
|
+
const reserved = parseTozReserved(json);
|
|
87
|
+
if (reserved.isLargeBooth) {
|
|
88
|
+
throw new Error('대형부스 예약은 선입금 약관 동의가 필요합니다. v1에서는 지원하지 않습니다 (small booths only).');
|
|
89
|
+
}
|
|
90
|
+
return reserved;
|
|
91
|
+
}
|
|
92
|
+
async skipEquipment(args) {
|
|
93
|
+
await this.http.postText('/ajaxReservationEquipment.htm', {
|
|
94
|
+
reservationId: args.reservationId,
|
|
95
|
+
basedate: args.date,
|
|
96
|
+
starttime: buildStartTimeParam(args.startTime),
|
|
97
|
+
durationTime: formatDuration(args.durationMinutes),
|
|
98
|
+
equipmentNotebookChecked: 'false',
|
|
99
|
+
equipmentProjectorChecked: 'false',
|
|
100
|
+
equipmentMonitorChecked: 'false',
|
|
101
|
+
equipmentPlayerChecked: 'false',
|
|
102
|
+
equipmentSpeakerChecked: 'false',
|
|
103
|
+
equipmentNotebookCnt: '0',
|
|
104
|
+
equipmentProjectorCnt: '0',
|
|
105
|
+
equipmentMonitorCnt: '0',
|
|
106
|
+
equipmentPlayerCnt: '0',
|
|
107
|
+
equipmentSpeakerCnt: '0',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async sendOtp(phone) {
|
|
111
|
+
const parts = parsePhone(this.requirePhone(phone));
|
|
112
|
+
const result = await this.http.postText('/ajaxHpVerify.htm', { ...parts });
|
|
113
|
+
if (result !== 'SUCCESS') {
|
|
114
|
+
throw new Error(`OTP 발송 실패: ${result}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async confirm(args) {
|
|
118
|
+
if (!args.meetingId && !args.newMeetingName) {
|
|
119
|
+
throw new Error('meetingId 또는 newMeetingName 중 하나는 필수입니다.');
|
|
120
|
+
}
|
|
121
|
+
const phoneParts = parsePhone(args.phone);
|
|
122
|
+
const emailParts = parseEmail(args.email);
|
|
123
|
+
const json = await this.http.postJson('/ajaxReservationConfirm.htm', {
|
|
124
|
+
reservationId: args.reservationId,
|
|
125
|
+
phone: formatPhone(phoneParts),
|
|
126
|
+
...phoneParts,
|
|
127
|
+
name: args.name,
|
|
128
|
+
pinNum: args.pinNum,
|
|
129
|
+
...emailParts,
|
|
130
|
+
meeting_id: args.meetingId ? String(args.meetingId) : '새모임',
|
|
131
|
+
newMeetingName: args.newMeetingName ?? '',
|
|
132
|
+
prepareMemo: args.memo ?? '',
|
|
133
|
+
projectSeq: '',
|
|
134
|
+
tozApplyType: '',
|
|
135
|
+
addedInfo: '',
|
|
136
|
+
attendType: '',
|
|
137
|
+
isMobile: 'false',
|
|
138
|
+
});
|
|
139
|
+
const resultMsg = json.resultMsg ?? '';
|
|
140
|
+
if (!isReservationConfirmSuccess(resultMsg)) {
|
|
141
|
+
throw new Error(resultMsg || '예약 확정에 실패했습니다.');
|
|
142
|
+
}
|
|
143
|
+
return { resultMsg, isLargeBooth: resultMsg.includes('대형부스') };
|
|
144
|
+
}
|
|
145
|
+
async destroyHold() {
|
|
146
|
+
await this.http.postText('/ajaxDestroyReservation.htm', {});
|
|
147
|
+
}
|
|
148
|
+
async myReservations(args = {}) {
|
|
149
|
+
await this.http.bootstrap();
|
|
150
|
+
await this.mypageLogin(this.requireName(args.name), this.requirePhone(args.phone));
|
|
151
|
+
const html = await this.http.post('/mypage.htm', {
|
|
152
|
+
opage: '1',
|
|
153
|
+
rpage: '1',
|
|
154
|
+
key: '',
|
|
155
|
+
projectSeq: '',
|
|
156
|
+
tozApplyType: '',
|
|
157
|
+
addedInfo: '',
|
|
158
|
+
startdate: args.startDate ?? '',
|
|
159
|
+
enddate: args.endDate ?? '',
|
|
160
|
+
meetingName: args.meetingName ?? '',
|
|
161
|
+
});
|
|
162
|
+
return parseMypageReservations(html);
|
|
163
|
+
}
|
|
164
|
+
async cancel(args) {
|
|
165
|
+
await this.http.bootstrap();
|
|
166
|
+
await this.mypageLogin(this.requireName(args.name), this.requirePhone(args.phone));
|
|
167
|
+
const result = await this.http.postText('/ajaxCancelReservation.htm', {
|
|
168
|
+
reservation_id: String(args.reservationId),
|
|
169
|
+
});
|
|
170
|
+
if (result !== 'SUCCESS') {
|
|
171
|
+
if (result === 'FAILED')
|
|
172
|
+
throw new Error('취소하지 못했습니다.');
|
|
173
|
+
throw new Error(result || '취소하지 못했습니다.');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
requireName(name) {
|
|
177
|
+
const resolved = name ?? this.identity.name;
|
|
178
|
+
if (!resolved)
|
|
179
|
+
throw new Error('Toz name is required (pass via args or TozClient({ name }))');
|
|
180
|
+
return resolved;
|
|
181
|
+
}
|
|
182
|
+
requirePhone(phone) {
|
|
183
|
+
const resolved = phone ?? this.identity.phone;
|
|
184
|
+
if (!resolved)
|
|
185
|
+
throw new Error('Toz phone is required (pass via args or TozClient({ phone }))');
|
|
186
|
+
return resolved;
|
|
187
|
+
}
|
|
188
|
+
async mypageLogin(name, phone) {
|
|
189
|
+
const parts = parsePhone(phone);
|
|
190
|
+
await this.http.post('/mypage_login_.htm', {
|
|
191
|
+
key: '',
|
|
192
|
+
projectSeq: '',
|
|
193
|
+
tozApplyType: '',
|
|
194
|
+
addedInfo: '',
|
|
195
|
+
email: '',
|
|
196
|
+
name,
|
|
197
|
+
...parts,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function sleep(ms) {
|
|
202
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=toz-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toz-client.js","sourceRoot":"","sources":["../../src/toz-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface TozPendingReservation {
|
|
2
|
+
reservationId: string;
|
|
3
|
+
cookies: Record<string, string>;
|
|
4
|
+
branchName: string;
|
|
5
|
+
branchTel: string;
|
|
6
|
+
boothGroupName: string;
|
|
7
|
+
isLargeBooth: boolean;
|
|
8
|
+
date: string;
|
|
9
|
+
startTime: string;
|
|
10
|
+
endTime: string;
|
|
11
|
+
durationMinutes: number;
|
|
12
|
+
userCount: number;
|
|
13
|
+
boothId: number;
|
|
14
|
+
meetingId?: number;
|
|
15
|
+
newMeetingName?: string;
|
|
16
|
+
email: string;
|
|
17
|
+
memo?: string;
|
|
18
|
+
name: string;
|
|
19
|
+
phone: string;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
expiresAt: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class TozPendingStore {
|
|
24
|
+
private readonly path;
|
|
25
|
+
constructor(configDir?: string);
|
|
26
|
+
get(): Promise<TozPendingReservation | null>;
|
|
27
|
+
set(reservation: TozPendingReservation): Promise<void>;
|
|
28
|
+
clear(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=toz-pending-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toz-pending-store.d.ts","sourceRoot":"","sources":["../../src/toz-pending-store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;gBAEjB,SAAS,CAAC,EAAE,MAAM;IAKxB,GAAG,IAAI,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAW5C,GAAG,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
export class TozPendingStore {
|
|
6
|
+
path;
|
|
7
|
+
constructor(configDir) {
|
|
8
|
+
const dir = configDir ?? join(homedir(), '.config', 'opensoma');
|
|
9
|
+
this.path = join(dir, 'toz-pending.json');
|
|
10
|
+
}
|
|
11
|
+
async get() {
|
|
12
|
+
if (!existsSync(this.path))
|
|
13
|
+
return null;
|
|
14
|
+
try {
|
|
15
|
+
const raw = await readFile(this.path, 'utf8');
|
|
16
|
+
return JSON.parse(raw);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async set(reservation) {
|
|
23
|
+
const dir = dirname(this.path);
|
|
24
|
+
await mkdir(dir, { recursive: true });
|
|
25
|
+
// Write to a temp file with 0o600 from creation, then rename atomically.
|
|
26
|
+
// Avoids the default 0o644 window between writeFile() and chmod() that
|
|
27
|
+
// would briefly expose the cookie + phone number to other users on the system.
|
|
28
|
+
const tmp = `${this.path}.tmp-${process.pid}-${Date.now()}`;
|
|
29
|
+
await writeFile(tmp, JSON.stringify(reservation, null, 2), { mode: 0o600 });
|
|
30
|
+
await rename(tmp, this.path);
|
|
31
|
+
}
|
|
32
|
+
async clear() {
|
|
33
|
+
await rm(this.path, { force: true });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=toz-pending-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toz-pending-store.js","sourceRoot":"","sources":["../../src/toz-pending-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAyBzC,MAAM,OAAO,eAAe;IACT,IAAI,CAAQ;IAE7B,YAAY,SAAkB;QAC5B,MAAM,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QAC/D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAEvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAA;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,WAAkC;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACrC,yEAAyE;QACzE,uEAAuE;QACvE,+EAA+E;QAC/E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;QAC3D,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3E,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACtC,CAAC;CACF"}
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -14,12 +14,14 @@ import {
|
|
|
14
14
|
roomCommand,
|
|
15
15
|
scheduleCommand,
|
|
16
16
|
teamCommand,
|
|
17
|
+
tozCommand,
|
|
17
18
|
} from './commands/index'
|
|
18
19
|
|
|
19
|
-
function
|
|
20
|
+
function isUnauthenticatedCommand(command: Command): boolean {
|
|
20
21
|
let current: Command | null = command
|
|
21
22
|
while (current) {
|
|
22
|
-
|
|
23
|
+
const name = current.name()
|
|
24
|
+
if (name === 'auth' || name === 'toz') {
|
|
23
25
|
return true
|
|
24
26
|
}
|
|
25
27
|
current = current.parent
|
|
@@ -32,7 +34,7 @@ const program = new Command()
|
|
|
32
34
|
program.name('opensoma').description('SWMaestro MyPage CLI for AI agents').version(pkg.version)
|
|
33
35
|
|
|
34
36
|
program.hook('preAction', async (_thisCommand, actionCommand) => {
|
|
35
|
-
if (
|
|
37
|
+
if (isUnauthenticatedCommand(actionCommand)) {
|
|
36
38
|
return
|
|
37
39
|
}
|
|
38
40
|
|
|
@@ -55,6 +57,7 @@ program.addCommand(teamCommand)
|
|
|
55
57
|
program.addCommand(memberCommand)
|
|
56
58
|
program.addCommand(scheduleCommand)
|
|
57
59
|
program.addCommand(reportCommand)
|
|
60
|
+
program.addCommand(tozCommand)
|
|
58
61
|
|
|
59
62
|
program.parse(process.argv)
|
|
60
63
|
|
package/src/client.ts
CHANGED
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
} from './shared/utils/swmaestro'
|
|
23
23
|
import { buildTeamActionPayload } from './shared/utils/team-action-params'
|
|
24
24
|
import { buildTeamListParams, type TeamSearchQuery } from './shared/utils/team-params'
|
|
25
|
+
import { TozClient } from './toz-client'
|
|
25
26
|
import type {
|
|
26
27
|
ApplicationHistoryItem,
|
|
27
28
|
ApprovalListItem,
|
|
@@ -52,6 +53,8 @@ export interface SomaClientOptions {
|
|
|
52
53
|
username?: string
|
|
53
54
|
password?: string
|
|
54
55
|
verbose?: boolean
|
|
56
|
+
tozName?: string
|
|
57
|
+
tozPhone?: string
|
|
55
58
|
/** @internal */
|
|
56
59
|
http?: SomaHttp
|
|
57
60
|
}
|
|
@@ -159,6 +162,8 @@ export class SomaClient {
|
|
|
159
162
|
list(options?: { page?: number }): Promise<{ items: ScheduleListItem[]; pagination: Pagination }>
|
|
160
163
|
}
|
|
161
164
|
|
|
165
|
+
readonly toz: TozClient
|
|
166
|
+
|
|
162
167
|
constructor(options: SomaClientOptions = {}) {
|
|
163
168
|
this.options = options
|
|
164
169
|
this.loginCredentials =
|
|
@@ -579,6 +584,11 @@ export class SomaClient {
|
|
|
579
584
|
return formatters.parseScheduleList(html)
|
|
580
585
|
},
|
|
581
586
|
}
|
|
587
|
+
|
|
588
|
+
this.toz = new TozClient({
|
|
589
|
+
name: options.tozName,
|
|
590
|
+
phone: options.tozPhone,
|
|
591
|
+
})
|
|
582
592
|
}
|
|
583
593
|
|
|
584
594
|
getSessionData(): { sessionCookie: string | undefined; csrfToken: string | null } {
|
|
@@ -115,6 +115,8 @@ describe('createAuthenticatedHttp', () => {
|
|
|
115
115
|
csrfToken: 'stale-csrf',
|
|
116
116
|
username: 'mentor@example.com',
|
|
117
117
|
password: 'secret',
|
|
118
|
+
tozName: 'Mentor One',
|
|
119
|
+
tozPhone: '010-1234-5678',
|
|
118
120
|
}),
|
|
119
121
|
setCredentials: async (credentials: Record<string, string>) => {
|
|
120
122
|
savedCredentials = credentials
|
|
@@ -154,6 +156,8 @@ describe('createAuthenticatedHttp', () => {
|
|
|
154
156
|
csrfToken: 'fresh-csrf',
|
|
155
157
|
username: 'mentor@example.com',
|
|
156
158
|
password: 'secret',
|
|
159
|
+
tozName: 'Mentor One',
|
|
160
|
+
tozPhone: '010-1234-5678',
|
|
157
161
|
})
|
|
158
162
|
})
|
|
159
163
|
|
package/src/commands/index.ts
CHANGED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describe, expect, it } from 'bun:test'
|
|
2
|
+
|
|
3
|
+
import { resolveTozIdentity, resolveTozPin } from './toz'
|
|
4
|
+
|
|
5
|
+
describe('resolveTozIdentity', () => {
|
|
6
|
+
it('uses flag values before stored identity', async () => {
|
|
7
|
+
const identity = await resolveTozIdentity('Mentor One', '010-1111-2222', {
|
|
8
|
+
promptPhone: async () => '010-3333-4444',
|
|
9
|
+
store: {
|
|
10
|
+
getTozIdentity: async () => ({ name: 'Mentor Two', phone: '010-5555-6666' }),
|
|
11
|
+
},
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
expect(identity).toEqual({ name: 'Mentor One', phone: '010-1111-2222' })
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
it('prompts for phone when name is available but phone is missing', async () => {
|
|
18
|
+
const identity = await resolveTozIdentity('Mentor One', undefined, {
|
|
19
|
+
promptPhone: async () => '010-3333-4444',
|
|
20
|
+
store: {
|
|
21
|
+
getTozIdentity: async () => null,
|
|
22
|
+
},
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
expect(identity).toEqual({ name: 'Mentor One', phone: '010-3333-4444' })
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('keeps non-interactive callers failing when phone is missing', async () => {
|
|
29
|
+
await expect(
|
|
30
|
+
resolveTozIdentity('Mentor One', undefined, {
|
|
31
|
+
store: {
|
|
32
|
+
getTozIdentity: async () => null,
|
|
33
|
+
},
|
|
34
|
+
}),
|
|
35
|
+
).rejects.toThrow(/Toz identity not set/)
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
describe('resolveTozPin', () => {
|
|
40
|
+
it('uses the flag value before prompting', async () => {
|
|
41
|
+
const pin = await resolveTozPin('123456', async () => '654321')
|
|
42
|
+
|
|
43
|
+
expect(pin).toBe('123456')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('prompts when the flag value is missing', async () => {
|
|
47
|
+
const pin = await resolveTozPin(undefined, async () => '654321')
|
|
48
|
+
|
|
49
|
+
expect(pin).toBe('654321')
|
|
50
|
+
})
|
|
51
|
+
})
|