mirror of
https://github.com/tiddly-gittly/TidGi-Desktop.git
synced 2026-04-13 09:12:51 -07:00
110 lines
7.5 KiB
Gherkin
110 lines
7.5 KiB
Gherkin
Feature: AI-Generated Git Commit Messages
|
||
As a user
|
||
I want AI to automatically generate commit messages
|
||
So that I can have meaningful backup titles based on my changes
|
||
|
||
@git @mockOpenAI
|
||
Scenario: AI button in Git Log window uses AI-generated commit message
|
||
Given I cleanup test wiki so it could create a new one on start
|
||
Given I add test ai settings:
|
||
| freeModel | true |
|
||
| aiGenerateBackupTitle | true |
|
||
# Start mock server BEFORE launching the application
|
||
And I have started the mock OpenAI server
|
||
| response | stream |
|
||
| 更新 Index 条目:添加关于 AI 测试的内容 | false |
|
||
# Now launch the application
|
||
And I launch the TidGi application
|
||
And I wait for the page to load completely
|
||
Then I should see a "default wiki workspace" element with selector "div[data-testid^='workspace-']:has-text('wiki')"
|
||
# Enable file system watch for testing (default is false in production)
|
||
When I update workspace "wiki" settings:
|
||
| property | value |
|
||
| enableFileSystemWatch | true |
|
||
When I click on a "default wiki workspace button" element with selector "div[data-testid^='workspace-']:has-text('wiki')"
|
||
Then the browser view should be loaded and visible
|
||
And I wait for SSE and watch-fs to be ready
|
||
And I wait for "git initialization" log marker "[test-id-git-init-complete]"
|
||
# Modify a file to create changes
|
||
When I modify file "{tmpDir}/wiki/tiddlers/Index.tid" to contain "AI-generated commit message test content"
|
||
Then I wait for tiddler "Index" to be updated by watch-fs
|
||
# Open Git Log window to commit using the AI button
|
||
When I click menu "同步和备份 > 查看历史备份"
|
||
And I switch to "gitHistory" window
|
||
And I wait for the page to load completely
|
||
# Should see uncommitted changes row
|
||
Then I should see a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
||
# Click on the uncommitted changes row
|
||
When I click on a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
||
# Verify we can see the modified Index.tid file
|
||
Then I should see a "Index.tid file in uncommitted list" element with selector "li:has-text('Index.tid')"
|
||
# Switch to Actions tab
|
||
When I click on a "actions tab" element with selector "button[role='tab']:has-text('操作'), button[role='tab']:has-text('Actions')"
|
||
# Both buttons must be visible: plain backup and AI backup
|
||
Then I should see "commit now button and commit now AI button" elements with selectors:
|
||
| element description | selector |
|
||
| commit now button | button[data-testid='commit-now-button'] |
|
||
| commit now AI button | button[data-testid='commit-now-ai-button'] |
|
||
# Click the AI commit button - this should call AI and produce the mocked message
|
||
When I click on a "commit now AI button" element with selector "button[data-testid='commit-now-ai-button']"
|
||
Then I wait for log markers:
|
||
| description | marker |
|
||
| git commit completed | [test-id-git-commit-complete] |
|
||
| git log data rendered to DOM | [test-id-git-log-data-rendered] |
|
||
# After commit, verify AI-generated message appears in git log table
|
||
Then I should see "commit with AI message and Index.tid file" elements with selectors:
|
||
| element description | selector |
|
||
| commit with AI message | p.MuiTypography-body2:has-text('更新 Index 条目') |
|
||
| Index.tid file | div.MuiBox-root[aria-label*='Index.tid'] |
|
||
|
||
@git @mockOpenAI
|
||
Scenario: Plain backup button in Git Log window uses default message, not AI — even when AI is enabled and mock is slow
|
||
# This scenario guards against regression where the plain backup button accidentally
|
||
# called the sync path which omitted commitMessage and therefore triggered AI generation.
|
||
# The mock server uses stream:true (5-second delay per chunk) to expose that bug:
|
||
# if the plain button were to go through AI, it would either hang >5 s or produce the
|
||
# mocked AI message instead of the default "使用太记桌面版备份".
|
||
Given I cleanup test wiki so it could create a new one on start
|
||
Given I add test ai settings:
|
||
| freeModel | true |
|
||
| aiGenerateBackupTitle | true |
|
||
# Slow streaming mock — each chunk takes 5 s. Plain backup button must complete before this finishes.
|
||
And I have started the mock OpenAI server
|
||
| response | stream |
|
||
| AI消息不应该出现在普通备份按钮里 | true |
|
||
And I launch the TidGi application
|
||
And I wait for the page to load completely
|
||
Then I should see a "default wiki workspace" element with selector "div[data-testid^='workspace-']:has-text('wiki')"
|
||
When I update workspace "wiki" settings:
|
||
| property | value |
|
||
| enableFileSystemWatch | true |
|
||
When I click on a "default wiki workspace button" element with selector "div[data-testid^='workspace-']:has-text('wiki')"
|
||
Then the browser view should be loaded and visible
|
||
And I wait for SSE and watch-fs to be ready
|
||
And I wait for "git initialization" log marker "[test-id-git-init-complete]"
|
||
When I modify file "{tmpDir}/wiki/tiddlers/Index.tid" to contain "Plain backup button test content"
|
||
Then I wait for tiddler "Index" to be updated by watch-fs
|
||
When I click menu "同步和备份 > 查看历史备份"
|
||
And I switch to "gitHistory" window
|
||
And I wait for the page to load completely
|
||
Then I should see a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
||
When I click on a "uncommitted changes row" element with selector "[data-testid='uncommitted-changes-row']"
|
||
Then I should see a "Index.tid file in uncommitted list" element with selector "li:has-text('Index.tid')"
|
||
When I click on a "actions tab" element with selector "button[role='tab']:has-text('操作'), button[role='tab']:has-text('Actions')"
|
||
Then I should see a "commit now button" element with selector "button[data-testid='commit-now-button']"
|
||
# Click the PLAIN (non-AI) button — must complete quickly with the default message
|
||
When I click on a "commit now button" element with selector "button[data-testid='commit-now-button']"
|
||
# The plain button must produce [test-id-git-commit-complete] WITHOUT waiting for the slow AI mock.
|
||
# If it mistakenly called AI, this would take ≥5 s per chunk and likely time out.
|
||
Then I wait for log markers:
|
||
| description | marker |
|
||
| git commit completed | [test-id-git-commit-complete] |
|
||
| git log data rendered to DOM | [test-id-git-log-data-rendered] |
|
||
# The commit message MUST be the default, not the AI mock response
|
||
Then I should see "commit with default message and Index.tid file" elements with selectors:
|
||
| element description | selector |
|
||
| commit with default message| p.MuiTypography-body2:has-text('使用太记桌面版备份') |
|
||
| Index.tid file | div.MuiBox-root[aria-label*='Index.tid'] |
|
||
# AI message must NOT appear — if it does, the plain button incorrectly used AI
|
||
Then I should not see a "AI message in commit list" element with selector "p.MuiTypography-body2:has-text('AI消息不应该出现在普通备份按钮里')"
|
||
|