数据填充与测试

模拟 Strapi 服务器

模拟服务器(scripts/mock-strapi.mjs)是一个轻量级的 Node.js HTTP 服务器,用于模拟 Strapi v5 REST API,使本地开发无需运行 CMS 实例。

启动方式:

node scripts/mock-strapi.mjs

服务监听地址为 http://localhost:1337

参考数据

服务器在启动时会创建以下内存中的参考数据:

  • 作者: FlexGalaxy.AI Team``(documentId ``author-001

  • 分类: Features``(slug ``features;zh-CN 本地化为 产品特性,ja 本地化为 機能紹介

  • 标签(16 个): efficiency、security、collaboration、data-analytics、AI、automation、scheduling、visualization、compliance、encryption、monitoring、IoT、integration、maintenance、AMR、API

文章由 seed-blog-content.mjs (9 篇功能文章) 和 seed-blog-edge-cases.mjs (11 篇边界情况文章) 合并而成,共计 20 篇。

端点

路径

行为

GET /api/articles

支持查询过滤的分页列表(详见下文)

GET /api/categories

返回分类列表;支持 locale 参数

GET /api/tags

分页标签列表

GET /api/pages

返回空列表(无模拟页面)

OPTIONS *

返回 204(CORS 预检请求)

其他路径

返回 404 JSON

文章查询参数:

  • filters[slug][$eq]=<slug> --- 按 slug 获取单篇文章

  • filters[category][slug][$eq]=<slug> --- 按分类过滤

  • filters[tags][slug][$eq]=<slug> --- 按标签过滤

  • pagination[page]=<n> / pagination[pageSize]=<n> --- 分页

种子脚本

这些脚本通过 Admin Content Manager API 向**真实的** Strapi v5 实例填充数据。

seed-blog-articles.mjs

创建所有参考数据(作者、带本地化的分类、16 个标签)以及 9 篇功能文章,包含英文、中文和日文本地化内容。

STRAPI_EMAIL=admin@flexgalaxy.ai \
STRAPI_PASSWORD=Admin12345 \
node scripts/seed-blog-articles.mjs

环境变量:

变量

默认值

说明

STRAPI_URL

http://localhost:1337

Strapi 基础 URL

STRAPI_EMAIL

(必填)

管理员邮箱

STRAPI_PASSWORD

(必填)

管理员密码

该脚本使用以下 Strapi Content Manager UID:

  • api::article.article

  • api::author.author

  • api::category.category

  • api::tag.tag

本地化内容通过 /actions/localize 端点为 zh-CN 和 ja 创建。所有文章在创建后会自动发布。

seed-blog-content.mjs

导出 ARTICLES --- 一个包含 9 篇功能文章定义的数组,涵盖 FlexGalaxy.AI 仓库与工厂自动化相关主题:

#

Slug

标签

1

data-processing-and-prediction

efficiency、data-analytics、AI

2

execution-and-planning

scheduling、automation、AI、efficiency

3

dashboards-and-statistics

visualization、data-analytics、efficiency

4

data-isolation-and-encryption

security、encryption、compliance

5

real-time-monitoring

monitoring、IoT、maintenance

6

proactive-alerts

monitoring、maintenance、AI、automation

7

unified-human-machine-platform

AMR、collaboration、automation

8

connect-multiple-iot-devices

IoT、AMR、integration

9

seamless-integration

integration、API、automation、efficiency

每篇文章都包含 slugtags[]locales.en.{ title, summary, content }

seed-blog-edge-cases.mjs

导出 EDGE_CASE_ARTICLES --- 11 篇用于压力测试博客渲染引擎的文章:

#

Slug

测试内容

1

edge-case-extremely-long-title-...

标题溢出与换行

2

edge-case-deep-heading-nesting

h2 至 h6 标题层级

3

edge-case-code-blocks

围栏代码块(TS、Python、Bash、JSON)

4

edge-case-lists-and-nesting

有序、无序及嵌套列表

5

edge-case-rich-formatting

引用块、粗体、斜体、删除线

6

edge-case-tables

宽表格、对齐方式、长内容

7

edge-case-very-long-article

8 节文章,滚动行为

8

edge-case-images

多种图片尺寸与排列

9

edge-case-youtube-embeds

YouTube iframe 嵌入,响应式容器

10

edge-case-mermaid-diagrams

流程图、时序图、ER 图、状态图、甘特图

11

edge-case-math-equations

行内与独立 LaTeX 数学公式

单元测试

项目使用 Vitest 搭配 React Testing Library,以 jsdom 作为 DOM 环境。

# Run once (CI mode)
npm test

# Watch mode
npm run test:watch

测试套件

i18n.test.ts --- 测试 src/lib/i18n.ts

  • 语言环境配置:3 种语言环境,默认为 en,所有语言环境均有标签

  • isValidLocale 对有效语言环境返回 true,对无效的返回 false

  • t() 针对 en、zh-CN、ja 返回正确的翻译

  • 当某语言环境中缺少翻译键时回退到英文

  • 当不存在任何翻译时返回键本身

  • 支持在所有语言环境中使用 {placeholder} 插值

strapi.test.ts --- 测试 src/lib/strapi.ts``(模拟 ``global.fetch):

  • fetchPublicPages 发送正确的过滤和语言环境参数

  • fetchPublicPage 返回页面,未找到时返回 null

  • fetchPublicArticles 发送分页和分类过滤参数

  • fetchPublicArticle 按 slug 返回文章

  • fetchFeaturedArticlesfeatured=true 过滤

  • fetchCategoriesfetchTags 返回数组

  • fetchPublicMediaCollections / fetchPublicMediaCollection 返回数据

  • 在非 OK 响应时抛出 "Strapi API error: <status>"

  • strapiMediaUrl 处理 null、undefined、绝对 URL 和相对 URL

SectionRenderer.test.tsx --- 测试 CMS 区块渲染:

  • 渲染 hero、功能网格、富文本和行动号召区块

  • 优雅地跳过未知区块类型

  • 无区块时渲染空输出

  • 按正确顺序渲染多个区块