mcp-paike 1.0.4 → 1.0.7
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/README.md +3 -139
- package/dist/index.js +0 -0
- package/dist/tools/attendances.d.ts.map +1 -1
- package/dist/tools/attendances.js +2 -1
- package/dist/tools/attendances.js.map +1 -1
- package/package.json +2 -2
- package/dist/__tests__/__mocks__/open.d.ts +0 -2
- package/dist/__tests__/__mocks__/open.d.ts.map +0 -1
- package/dist/__tests__/__mocks__/open.js +0 -5
- package/dist/__tests__/__mocks__/open.js.map +0 -1
- package/dist/__tests__/toolRegistry.test.d.ts +0 -2
- package/dist/__tests__/toolRegistry.test.d.ts.map +0 -1
- package/dist/__tests__/toolRegistry.test.js +0 -160
- package/dist/__tests__/toolRegistry.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,141 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# mcp-paike
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
薄荷排课系统 MCP Server
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
### 1. 配置
|
|
8
|
-
|
|
9
|
-
编辑 `~/.claude.json`(如果文件不存在就新建),添加以下内容:
|
|
10
|
-
|
|
11
|
-
```json
|
|
12
|
-
{
|
|
13
|
-
"mcpServers": {
|
|
14
|
-
"paike": {
|
|
15
|
-
"command": "npx",
|
|
16
|
-
"args": ["-y", "mcp-paike@latest"]
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
> 如果文件已有其他内容,只需添加 `mcpServers` 字段即可。
|
|
23
|
-
|
|
24
|
-
<details>
|
|
25
|
-
<summary>国内网络慢?点击设置镜像源</summary>
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
npm config set registry https://registry.npmmirror.com
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
</details>
|
|
32
|
-
|
|
33
|
-
<details>
|
|
34
|
-
<summary>其他安装方式</summary>
|
|
35
|
-
|
|
36
|
-
**全局安装(启动更快):**
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npm install -g mcp-paike
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
配置改为:
|
|
43
|
-
|
|
44
|
-
```json
|
|
45
|
-
{
|
|
46
|
-
"mcpServers": {
|
|
47
|
-
"paike": {
|
|
48
|
-
"command": "mcp-paike"
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
</details>
|
|
55
|
-
|
|
56
|
-
### 2. 登录
|
|
57
|
-
|
|
58
|
-
1. 重启 Claude Code(退出后重新打开)
|
|
59
|
-
2. 在 Claude Code 中说:「登录排课系统」
|
|
60
|
-
3. 浏览器会自动打开,扫码登录即可
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## 可用工具
|
|
65
|
-
|
|
66
|
-
| 工具名 | 描述 |
|
|
67
|
-
|--------|------|
|
|
68
|
-
| `login` | 企业微信登录 |
|
|
69
|
-
| `get_current_user` | 获取当前登录用户信息 |
|
|
70
|
-
| `list_students` | 查询学员列表 |
|
|
71
|
-
| `get_student` | 获取学员详情 |
|
|
72
|
-
| `get_student_class` | 获取学员当前班级 |
|
|
73
|
-
| `get_student_packages` | 获取学员课包 |
|
|
74
|
-
| `get_student_balances` | 获取学员课次余额 |
|
|
75
|
-
| `list_classes` | 查询班级列表 |
|
|
76
|
-
| `get_class` | 获取班级详情 |
|
|
77
|
-
| `get_class_students` | 获取班级学员名单 |
|
|
78
|
-
| `list_sessions` | 查询课程排期 |
|
|
79
|
-
| `get_session` | 获取课程详情 |
|
|
80
|
-
| `list_attendances` | 查询考勤记录 |
|
|
81
|
-
| `get_attendance` | 获取考勤详情 |
|
|
82
|
-
| `list_teachers` | 获取教师列表 |
|
|
83
|
-
|
|
84
|
-
## 使用示例
|
|
85
|
-
|
|
86
|
-
```
|
|
87
|
-
# 查询在学学员
|
|
88
|
-
list_students(status: "ACTIVE")
|
|
89
|
-
|
|
90
|
-
# 搜索学员
|
|
91
|
-
list_students(search: "张三")
|
|
92
|
-
|
|
93
|
-
# 获取学员详情
|
|
94
|
-
get_student(studentId: "xxx-xxx-xxx")
|
|
95
|
-
|
|
96
|
-
# 查询本周课程
|
|
97
|
-
list_sessions(startDate: "2025-12-22", endDate: "2025-12-28")
|
|
98
|
-
|
|
99
|
-
# 查询考勤
|
|
100
|
-
list_attendances(sessionId: "xxx-xxx-xxx")
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Token 说明
|
|
104
|
-
|
|
105
|
-
- Token 有效期为 **24 小时**
|
|
106
|
-
- 过期后重新说「登录排课系统」即可
|
|
107
|
-
- Token 保存在 `~/.config/mcp-paike/credentials.json`
|
|
108
|
-
|
|
109
|
-
## 注意事项
|
|
110
|
-
|
|
111
|
-
1. **只读接口**: 不能修改任何数据,仅提供查询功能
|
|
112
|
-
2. **权限控制**: 查询结果受用户权限控制(教师只能看到自己班级的学员)
|
|
113
|
-
3. **Token 安全**: Token 请勿分享,它代表您的身份
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## 本地开发
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
cd mcp-server
|
|
121
|
-
npm install
|
|
122
|
-
npm run build
|
|
123
|
-
npm run dev
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
本地开发模式的配置(`~/.claude.json`):
|
|
127
|
-
|
|
128
|
-
```json
|
|
129
|
-
{
|
|
130
|
-
"mcpServers": {
|
|
131
|
-
"paike": {
|
|
132
|
-
"command": "node",
|
|
133
|
-
"args": ["/path/to/mcp-server/dist/index.js"],
|
|
134
|
-
"env": {
|
|
135
|
-
"MCP_API_BASE_URL": "https://paike.bohecoding.com",
|
|
136
|
-
"MCP_AUTH_PAGE_URL": "https://paike.bohecoding.com/mcp-auth"
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
```
|
|
5
|
+
> 仅限内部使用
|
package/dist/index.js
CHANGED
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attendances.d.ts","sourceRoot":"","sources":["../../src/tools/attendances.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAiCR;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,KAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"attendances.d.ts","sourceRoot":"","sources":["../../src/tools/attendances.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAiCR;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,KAAG,OAAO,CAAC,UAAU,CAAC;CAuDxB,CAAC;AAGF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;oBAaN;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,UAAU,CAAC;CA+BrE,CAAC;AAGF,eAAO,MAAM,gBAAgB;;;;;;;;mBAQR,OAAO,CAAC,UAAU,CAAC;CAkCvC,CAAC;AAiCF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA3LJ;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,KAAG,OAAO,CAAC,UAAU,CAAC;;;;;;;;;;;;;;oBAuED;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,UAAU,CAAC;;;;;;;;;mBA0CjD,OAAO,CAAC,UAAU,CAAC;IAuEvC,CAAC"}
|
|
@@ -60,11 +60,12 @@ export const listAttendancesTool = {
|
|
|
60
60
|
sessionsDeducted: a.sessionsDeducted,
|
|
61
61
|
deductionType: formatDeductionType(a.deductionType),
|
|
62
62
|
}));
|
|
63
|
+
const totalPages = Math.ceil(result.total / result.pageSize) || 1;
|
|
63
64
|
return {
|
|
64
65
|
content: [
|
|
65
66
|
{
|
|
66
67
|
type: 'text',
|
|
67
|
-
text: `查询结果: 共 ${result.
|
|
68
|
+
text: `查询结果: 共 ${result.total} 条记录 (第 ${result.page}/${totalPages} 页)\n\n` +
|
|
68
69
|
attendances.map((a, index) => `${index + 1}. ${a.studentName} | ${a.sessionTime} [ID: ${a.id}]\n` +
|
|
69
70
|
` 班级: ${a.className}\n` +
|
|
70
71
|
` 状态: ${a.status} | 扣课: ${a.sessionsDeducted}节 (${a.deductionType})`).join('\n\n'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attendances.js","sourceRoot":"","sources":["../../src/tools/attendances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAO5C,mBAAmB;AACnB,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,MAAM;aACpB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,MAAM;aACpB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mBAAmB;aACjC;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mBAAmB;aACjC;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,QAAQ;aACtB;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,WAAW;aACzB;SACF;QACD,QAAQ,EAAE,EAAE;KACb;IACD,OAAO,EAAE,KAAK,EAAE,IAOf,EAAuB,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE7B,2CAA2C;YAC3C,MAAM,MAAM,GAAwB;gBAClC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;gBACjC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;aAC1D,CAAC;YAEF,IAAI,IAAI,CAAC,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACtD,IAAI,IAAI,CAAC,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACtD,IAAI,IAAI,CAAC,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACtD,IAAI,IAAI,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAEhD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"attendances.js","sourceRoot":"","sources":["../../src/tools/attendances.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-paike",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "MCP Server for Children's Coding Training Scheduling System - 少儿编程培训排课系统 Claude Code 接口",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"license": "GPL-3.0-only",
|
|
51
51
|
"repository": {
|
|
52
52
|
"type": "git",
|
|
53
|
-
"url": "https://github.com/huangbow/mint_coding_management_system.git",
|
|
53
|
+
"url": "git+https://github.com/huangbow/mint_coding_management_system.git",
|
|
54
54
|
"directory": "mcp-server"
|
|
55
55
|
},
|
|
56
56
|
"homepage": "https://github.com/huangbow/mint_coding_management_system/tree/main/mcp-server"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/__tests__/__mocks__/open.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/__tests__/__mocks__/open.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,MAAc;IACzC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolRegistry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/toolRegistry.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
// Unit tests for role-based tool filtering logic
|
|
2
|
-
// Testing the filtering algorithm directly without importing heavy dependencies
|
|
3
|
-
// Extract the filtering logic for testing
|
|
4
|
-
function getToolsForRole(tools, userRole) {
|
|
5
|
-
return tools.filter((tool) => {
|
|
6
|
-
// No role requirement = available to all authenticated users
|
|
7
|
-
if (!tool.requiredRole)
|
|
8
|
-
return true;
|
|
9
|
-
// ADMIN requirement: Only ADMIN or SUPER_ADMIN
|
|
10
|
-
if (tool.requiredRole === 'ADMIN') {
|
|
11
|
-
return userRole === 'ADMIN' || userRole === 'SUPER_ADMIN';
|
|
12
|
-
}
|
|
13
|
-
return false;
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
describe('Role-based tool filtering', () => {
|
|
17
|
-
// Mock tools for testing
|
|
18
|
-
const mockTools = [
|
|
19
|
-
{
|
|
20
|
-
name: 'login',
|
|
21
|
-
description: 'Login tool',
|
|
22
|
-
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
23
|
-
handler: async () => ({ content: [] }),
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: 'get_teacher_sales',
|
|
27
|
-
description: 'Teacher sales tool (all users)',
|
|
28
|
-
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
29
|
-
handler: async () => ({ content: [] }),
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
name: 'get_student_balance_detail',
|
|
33
|
-
description: 'Student balance tool (all users)',
|
|
34
|
-
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
35
|
-
handler: async () => ({ content: [] }),
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
name: 'get_session_fee_rules',
|
|
39
|
-
description: 'Session fee rules (admin only)',
|
|
40
|
-
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
41
|
-
handler: async () => ({ content: [] }),
|
|
42
|
-
requiredRole: 'ADMIN',
|
|
43
|
-
},
|
|
44
|
-
];
|
|
45
|
-
describe('getToolsForRole', () => {
|
|
46
|
-
it('should hide admin-only tools from STAFF users', () => {
|
|
47
|
-
const tools = getToolsForRole(mockTools, 'STAFF');
|
|
48
|
-
const toolNames = tools.map((t) => t.name);
|
|
49
|
-
expect(toolNames).not.toContain('get_session_fee_rules');
|
|
50
|
-
expect(toolNames).toContain('get_teacher_sales');
|
|
51
|
-
expect(toolNames).toContain('get_student_balance_detail');
|
|
52
|
-
expect(toolNames).toContain('login');
|
|
53
|
-
expect(tools.length).toBe(3);
|
|
54
|
-
});
|
|
55
|
-
it('should show admin-only tools to ADMIN users', () => {
|
|
56
|
-
const tools = getToolsForRole(mockTools, 'ADMIN');
|
|
57
|
-
const toolNames = tools.map((t) => t.name);
|
|
58
|
-
expect(toolNames).toContain('get_session_fee_rules');
|
|
59
|
-
expect(toolNames).toContain('get_teacher_sales');
|
|
60
|
-
expect(toolNames).toContain('get_student_balance_detail');
|
|
61
|
-
expect(tools.length).toBe(4);
|
|
62
|
-
});
|
|
63
|
-
it('should show admin-only tools to SUPER_ADMIN users', () => {
|
|
64
|
-
const tools = getToolsForRole(mockTools, 'SUPER_ADMIN');
|
|
65
|
-
const toolNames = tools.map((t) => t.name);
|
|
66
|
-
expect(toolNames).toContain('get_session_fee_rules');
|
|
67
|
-
expect(tools.length).toBe(4);
|
|
68
|
-
});
|
|
69
|
-
it('should hide admin-only tools when user is null (not authenticated)', () => {
|
|
70
|
-
const tools = getToolsForRole(mockTools, null);
|
|
71
|
-
const toolNames = tools.map((t) => t.name);
|
|
72
|
-
expect(toolNames).not.toContain('get_session_fee_rules');
|
|
73
|
-
expect(toolNames).toContain('login');
|
|
74
|
-
expect(tools.length).toBe(3);
|
|
75
|
-
});
|
|
76
|
-
it('should handle empty tools array', () => {
|
|
77
|
-
const tools = getToolsForRole([], 'ADMIN');
|
|
78
|
-
expect(tools.length).toBe(0);
|
|
79
|
-
});
|
|
80
|
-
it('should handle unknown role by hiding admin tools', () => {
|
|
81
|
-
const tools = getToolsForRole(mockTools, 'UNKNOWN_ROLE');
|
|
82
|
-
const toolNames = tools.map((t) => t.name);
|
|
83
|
-
expect(toolNames).not.toContain('get_session_fee_rules');
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
describe('Tool configuration validation', () => {
|
|
87
|
-
it('admin-only tools should have requiredRole set to ADMIN', () => {
|
|
88
|
-
const adminTool = mockTools.find((t) => t.name === 'get_session_fee_rules');
|
|
89
|
-
expect(adminTool?.requiredRole).toBe('ADMIN');
|
|
90
|
-
});
|
|
91
|
-
it('regular tools should not have requiredRole set', () => {
|
|
92
|
-
const regularTool = mockTools.find((t) => t.name === 'get_teacher_sales');
|
|
93
|
-
expect(regularTool?.requiredRole).toBeUndefined();
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
describe('STAFF data isolation for get_teacher_sales', () => {
|
|
98
|
-
// Test the permission logic for STAFF users
|
|
99
|
-
function canStaffAccessTeacherData(userRole, userId, requestedTeacherId) {
|
|
100
|
-
const isAdmin = userRole === 'ADMIN' || userRole === 'SUPER_ADMIN';
|
|
101
|
-
if (!isAdmin) {
|
|
102
|
-
// STAFF can only query their own data
|
|
103
|
-
if (requestedTeacherId && requestedTeacherId !== userId) {
|
|
104
|
-
return { allowed: false, reason: 'STAFF can only query own data' };
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return { allowed: true };
|
|
108
|
-
}
|
|
109
|
-
it('STAFF should be able to query their own data', () => {
|
|
110
|
-
const result = canStaffAccessTeacherData('STAFF', 'user-123', 'user-123');
|
|
111
|
-
expect(result.allowed).toBe(true);
|
|
112
|
-
});
|
|
113
|
-
it('STAFF should NOT be able to query other teachers data', () => {
|
|
114
|
-
const result = canStaffAccessTeacherData('STAFF', 'user-123', 'other-user-456');
|
|
115
|
-
expect(result.allowed).toBe(false);
|
|
116
|
-
expect(result.reason).toBe('STAFF can only query own data');
|
|
117
|
-
});
|
|
118
|
-
it('STAFF should be able to query without specifying teacherId (defaults to self)', () => {
|
|
119
|
-
const result = canStaffAccessTeacherData('STAFF', 'user-123', undefined);
|
|
120
|
-
expect(result.allowed).toBe(true);
|
|
121
|
-
});
|
|
122
|
-
it('ADMIN should be able to query any teacher data', () => {
|
|
123
|
-
const result = canStaffAccessTeacherData('ADMIN', 'admin-user', 'other-teacher-789');
|
|
124
|
-
expect(result.allowed).toBe(true);
|
|
125
|
-
});
|
|
126
|
-
it('SUPER_ADMIN should be able to query any teacher data', () => {
|
|
127
|
-
const result = canStaffAccessTeacherData('SUPER_ADMIN', 'super-admin', 'any-teacher');
|
|
128
|
-
expect(result.allowed).toBe(true);
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
describe('Currency parsing', () => {
|
|
132
|
-
// Test the fixed currency parsing logic
|
|
133
|
-
function parseCurrency(value) {
|
|
134
|
-
return parseFloat((value || '¥0').replace('¥', '').replace(/,/g, '')) || 0;
|
|
135
|
-
}
|
|
136
|
-
it('should parse simple currency values', () => {
|
|
137
|
-
expect(parseCurrency('¥123.45')).toBe(123.45);
|
|
138
|
-
});
|
|
139
|
-
it('should parse values with thousands separator', () => {
|
|
140
|
-
expect(parseCurrency('¥12,345.67')).toBe(12345.67);
|
|
141
|
-
});
|
|
142
|
-
it('should parse values with multiple commas', () => {
|
|
143
|
-
expect(parseCurrency('¥1,234,567.89')).toBe(1234567.89);
|
|
144
|
-
});
|
|
145
|
-
it('should handle null values', () => {
|
|
146
|
-
expect(parseCurrency(null)).toBe(0);
|
|
147
|
-
});
|
|
148
|
-
it('should handle undefined values', () => {
|
|
149
|
-
expect(parseCurrency(undefined)).toBe(0);
|
|
150
|
-
});
|
|
151
|
-
it('should handle values without currency symbol', () => {
|
|
152
|
-
expect(parseCurrency('1,234.56')).toBe(1234.56);
|
|
153
|
-
});
|
|
154
|
-
it('should handle zero values', () => {
|
|
155
|
-
expect(parseCurrency('¥0')).toBe(0);
|
|
156
|
-
expect(parseCurrency('¥0.00')).toBe(0);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
export {};
|
|
160
|
-
//# sourceMappingURL=toolRegistry.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolRegistry.test.js","sourceRoot":"","sources":["../../src/__tests__/toolRegistry.test.ts"],"names":[],"mappings":"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"}
|