The upstream project name is gone from code, assets, docs and build
output: brand strings, domains (replypier.site and its app/api/docs/help
subdomains), env prefixes, image and network names, the widget's public
JS API (window.ReplyPier, replypierId/BaseUrl/Config/Token), CSS tokens
(--rp-*), file and directory names, and the WordPress plugin package.
- widget loader is now webclient/replypier.min.js; both bundles rebuilt
from source (backend/assets/widget.{js,css}, frontend/public/webclient)
- NOTICE, llms.txt, CONTRIBUTING, HELP_CENTER_INFRA and config.dev.js
rewritten rather than string-swapped; the demo config no longer ships
the previous vendor's Firebase/Razorpay/Google keys
- new migration replypier_ai_model_001 adds REPLYPIER to the managed
AIModelType and rewrites pre-rename rows
- local compose project, database, role and volume renamed; LOCAL_DEPLOY
documents carrying the old local data over
70 lines
2.3 KiB
TypeScript
70 lines
2.3 KiB
TypeScript
/*
|
|
Copyright 2024-2026 ReplyPier
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
import { describe, it, expect } from 'vitest'
|
|
import {
|
|
DEFAULT_MCP_TIMEOUT,
|
|
MAX_MCP_TIMEOUT,
|
|
MIN_MCP_TIMEOUT,
|
|
clampMCPTimeout,
|
|
linesToRecord,
|
|
recordToLines,
|
|
} from '@/utils/mcp'
|
|
|
|
describe('clampMCPTimeout', () => {
|
|
it('keeps a value the API accepts', () => {
|
|
expect(clampMCPTimeout(120)).toBe(120)
|
|
})
|
|
|
|
it('pulls an over-range value down to the maximum', () => {
|
|
// A number input's max doesn't block submission, and the 422 that would
|
|
// come back carries a validation payload rather than a readable message.
|
|
expect(clampMCPTimeout(900)).toBe(MAX_MCP_TIMEOUT)
|
|
})
|
|
|
|
it('rounds a fractional value to whole seconds', () => {
|
|
expect(clampMCPTimeout(45.6)).toBe(46)
|
|
expect(clampMCPTimeout(0.4)).toBe(MIN_MCP_TIMEOUT)
|
|
})
|
|
|
|
it('falls back to the default when the field is empty or nonsense', () => {
|
|
expect(clampMCPTimeout(undefined)).toBe(DEFAULT_MCP_TIMEOUT)
|
|
expect(clampMCPTimeout(null)).toBe(DEFAULT_MCP_TIMEOUT)
|
|
expect(clampMCPTimeout(NaN)).toBe(DEFAULT_MCP_TIMEOUT)
|
|
expect(clampMCPTimeout(0)).toBe(DEFAULT_MCP_TIMEOUT)
|
|
expect(clampMCPTimeout(-5)).toBe(DEFAULT_MCP_TIMEOUT)
|
|
})
|
|
})
|
|
|
|
describe('KEY=value line editing', () => {
|
|
it('round-trips a record through the textarea form', () => {
|
|
const record = { AWS_REGION: 'us-east-1', AWS_ACCESS_KEY_ID: 'abc' }
|
|
expect(linesToRecord(recordToLines(record))).toEqual(record)
|
|
})
|
|
|
|
it('keeps a value containing "=" intact', () => {
|
|
expect(linesToRecord('Authorization=Bearer a=b')).toEqual({ Authorization: 'Bearer a=b' })
|
|
})
|
|
|
|
it('ignores lines without a key', () => {
|
|
expect(linesToRecord('novalue\n=orphan\nA=1')).toEqual({ A: '1' })
|
|
})
|
|
|
|
it('treats a missing record as empty', () => {
|
|
expect(recordToLines(undefined)).toBe('')
|
|
})
|
|
})
|