-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdevlog.test.ts
More file actions
149 lines (136 loc) · 7.04 KB
/
Copy pathdevlog.test.ts
File metadata and controls
149 lines (136 loc) · 7.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import { describe, expect, it } from "vitest";
import { 연동기록 } from "./devlog";
describe("연동기록 — 화면에 뜨는 값이라 누구인지는 가린다", () => {
/*
* 백엔드가 토큰을 발급하지 않아서 userId 자체가 열쇠다. 숫자만 알면 그 사람의
* 주문표를 읽고 쓸 수 있다. 이 기록은 구석 패널과 ?log 화면에 그대로 뜨고
* 시연 녹화에도 같이 찍히므로, 띄우는 것이 곧 그 열쇠를 보여 주는 일이 된다.
*/
const 남기고읽기 = (경로: string) => {
연동기록.남기기({ 방법: "GET", 경로, 상태: 200, 걸린시간: 1, 시각: Date.now() });
return 연동기록.읽기()[0].경로;
};
it("주문표 경로의 userId 를 가린다", () => {
expect(남기고읽기("/api/v1/users/12345/profiles")).toBe("/api/v1/users/***/profiles");
expect(남기고읽기("/api/v1/users/7/profiles")).not.toContain("7");
});
it("무엇을 불렀는지는 그대로 남긴다", () => {
expect(남기고읽기("/internal/orchestrator/approve")).toBe("/internal/orchestrator/approve");
expect(남기고읽기("/api/v1/auth/login")).toBe("/api/v1/auth/login");
});
it("비우면 남지 않는다 — '이 기기에서 정보 지우기' 가 여기까지 닿아야 한다", () => {
남기고읽기("/api/v1/recommendations");
expect(연동기록.읽기().length).toBeGreaterThan(0);
연동기록.비우기();
expect(연동기록.읽기()).toEqual([]);
});
});
describe("연동기록 — 자유 입력은 본문에서도 가린다", () => {
/*
* memo 는 이 앱에서 사용자가 아무거나 적을 수 있는 유일한 칸이다.
* 저장 전에 전화번호.주민등록번호.주소 모양은 걸러 막지만 이름은 못 거른다.
* 그 값이 로그 본문에 남아 화면과 시연 녹화에 그대로 뜨면 안 된다.
*/
const 남기고읽기 = (요청: string) => {
연동기록.남기기({ 방법: "POST", 경로: "/api/v1/profile-normalizations", 상태: 200, 걸린시간: 1, 시각: Date.now(), 요청 });
return 연동기록.읽기()[0].요청 ?? "";
};
it("어느 깊이에 있든 memo 값을 가린다", () => {
const 남은 = 남기고읽기(JSON.stringify({
environmentId: "chicken-store",
profileInput: { profileId: "p1", memo: "김할머니 앞으로 해주세요" },
}));
expect(남은).not.toContain("김할머니");
expect(남은).toContain('"memo":"***"');
// 무엇을 보냈는지는 그대로 알 수 있어야 한다.
expect(남은).toContain("chicken-store");
expect(남은).toContain("p1");
});
it("응답 본문에서도 memo 를 가리고, JSON 이 아니면 안 남긴다", () => {
/*
* 남기기() 는 요청.응답 양쪽에 같은 가리기를 건다. 그런데 테스트가 요청만
* 보고 있으면, 응답 쪽 가리기가 빠져도 초록으로 통과한다.
* 주문표 조회 응답에는 저장해 둔 memo 가 그대로 실려 온다.
*/
연동기록.남기기({
방법: "GET", 경로: "/api/v1/users/7/profiles", 상태: 200, 걸린시간: 1, 시각: Date.now(),
응답: JSON.stringify([{ profileId: "p1", memo: "김할머니 앞으로 해주세요" }]),
});
const 응답 = 연동기록.읽기()[0].응답 ?? "";
expect(응답).not.toContain("김할머니");
expect(응답).toContain('"memo":"***"');
/*
* not.toContain 하나로는 부족하다. 응답이 undefined 여도 통과한다 - 가리기가
* 통째로 빠져도 초록이다. 무엇으로 바뀌었는지까지 본다.
*
* 기록 자체는 남는다. 본문만 통째로 갈린다 - 무엇을 불렀는지는 알아야
* 로그가 쓸모 있고, 못 가리는 본문만 안 보여 주면 된다.
*/
const 이전 = 연동기록.읽기().length;
연동기록.남기기({
방법: "GET", 경로: "/api/v1/users/7/profiles", 상태: 200, 걸린시간: 1, 시각: Date.now(),
응답: "<html>프록시가 끼워 넣은 것</html>",
});
expect(연동기록.읽기()).toHaveLength(이전 + 1);
expect(연동기록.읽기()[0].응답 ?? "").not.toContain("html");
expect(연동기록.읽기()[0].응답).toContain("가리지 못했습니다");
});
it("실행 단계의 label 도 가린다", () => {
/*
* 화면 쪽은 아는 값만 통과시키도록 막았지만, 이 기록은 응답 본문을 통째로
* 담는다. 서버가 상품 ID 나 좌표를 보내면 화면에는 안 떠도 여기 남는다.
*/
연동기록.남기기({
방법: "POST", 경로: "/internal/orchestrator/approve", 상태: 200, 걸린시간: 1, 시각: Date.now(),
응답: JSON.stringify({
valid: true,
runSteps: [
{ actionIndex: 0, action: "select_menu", label: "서버가 보낸 값 1", success: true },
{ actionIndex: 1, action: "select_option", label: "서버가 보낸 값 2", success: true },
],
}),
});
const 응답 = 연동기록.읽기()[0].응답 ?? "";
// 가리기는 값의 모양이 아니라 label 키를 보고 건다. 중립적인 값으로도 똑같다.
expect(응답).not.toContain("서버가 보낸 값 1");
expect(응답).not.toContain("서버가 보낸 값 2");
// 무엇을 했는지는 남는다. 흐름을 보는 데는 지장이 없다.
expect(응답).toContain("select_menu");
expect(응답).toContain('"label":"***"');
});
it("JSON 이 아니면 아예 남기지 않는다", () => {
const 남은 = 남기고읽기("<html>프록시가 끼워 넣은 것</html>");
expect(남은).not.toContain("html");
});
});
describe("직접 부르는 경로도 기록에 남는다", () => {
/*
* 맵기 매칭과 음성 인식은 createTeamBackend 를 안 거치고 직접 부른다. 그래서
* 개발 패널에 아무 줄도 안 떴고, 서버에 붙은 것인지 아닌지 눈으로 알 수
* 없었다 — 그 패널을 만든 이유가 바로 그걸 보는 것인데.
*
* 대신 **본문은 안 남긴다.** 두 경로 다 사용자가 방금 한 말이 실린다.
* '가림' 으로 표시해서, 보는 사람이 '비어 있는 것' 과 '일부러 안 남긴 것' 을
* 헷갈리지 않게 한다.
*/
it("본문 없이 남긴 것은 가림으로 표시된다", () => {
연동기록.비우기();
연동기록.남기기({
방법: "POST", 경로: "/api/bff/internal/spicy-level/match",
상태: 200, 걸린시간: 12, 시각: Date.now(), 가림: true,
});
const [한줄] = 연동기록.읽기();
expect(한줄.경로).toContain("spicy-level/match");
expect(한줄.가림).toBe(true);
expect(한줄.요청).toBeUndefined();
expect(한줄.응답).toBeUndefined();
});
it("실패도 남는다 — 안 뜨면 안 부른 것과 구분이 안 된다", () => {
연동기록.비우기();
연동기록.남기기({
방법: "POST", 경로: "/api/bff/api/v1/voice/transcribe",
상태: "실패", 걸린시간: 8000, 시각: Date.now(), 가림: true,
});
expect(연동기록.읽기()[0].상태).toBe("실패");
});
});