feat: Initial clean release of CHM
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
这个提交包含在:
153
packages/lib/versionInfo.test.ts
普通文件
153
packages/lib/versionInfo.test.ts
普通文件
@@ -0,0 +1,153 @@
|
||||
import versionInfo from './versionInfo';
|
||||
import { reg } from './registry';
|
||||
import { Plugins } from './services/plugins/PluginService';
|
||||
import Plugin from './services/plugins/Plugin';
|
||||
import Setting from './models/Setting';
|
||||
|
||||
jest.mock('./registry');
|
||||
|
||||
const mockedVersion = jest.fn(() => 'test');
|
||||
const mockedDb = { version: mockedVersion };
|
||||
|
||||
const packageInfo = {
|
||||
'name': 'Joplin',
|
||||
'version': '2.10.5',
|
||||
'description': 'Joplin for Desktop',
|
||||
'repository': {
|
||||
'type': 'git',
|
||||
'url': 'git+https://github.com/laurent22/joplin.git',
|
||||
},
|
||||
'author': 'Laurent Cozic',
|
||||
'license': 'AGPL-3.0-or-later',
|
||||
'bugs': {
|
||||
'url': 'https://github.com/laurent22/joplin/issues',
|
||||
},
|
||||
'homepage': 'https://github.com/laurent22/joplin#readme',
|
||||
'build': {
|
||||
'appId': 'net.cozic.joplin-desktop',
|
||||
},
|
||||
'git': {
|
||||
'branch': 'dev',
|
||||
'hash': '1b527f2bb',
|
||||
},
|
||||
};
|
||||
|
||||
describe('versionInfo', () => {
|
||||
|
||||
beforeAll(() => {
|
||||
(reg.db as jest.Mock).mockReturnValue(mockedDb);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
|
||||
it('should not list any plugin when no plugin is installed', () => {
|
||||
const v = versionInfo(packageInfo, {});
|
||||
expect(v.body).toMatch(/Revision:\s[a-z0-9]{3,}\s\([a-zA-Z0-9-_/.]{1,}\)$/);
|
||||
expect(v.message).toMatch(/Revision:\s[a-z0-9]{3,}\s\([a-zA-Z0-9-_/.]{1,}\)$/);
|
||||
});
|
||||
|
||||
it('should list one plugin', () => {
|
||||
const plugin: Plugin = new Plugin(
|
||||
'',
|
||||
{
|
||||
manifest_version: 1,
|
||||
id: '1',
|
||||
name: 'Plugin1',
|
||||
version: '1',
|
||||
app_min_version: '1' },
|
||||
'',
|
||||
() => {},
|
||||
'',
|
||||
);
|
||||
|
||||
const plugins: Plugins = {};
|
||||
plugins[plugin.manifest.id] = plugin;
|
||||
|
||||
const v = versionInfo(packageInfo, plugins);
|
||||
expect(v.body).toMatch(/\n\nPlugin1: 1/);
|
||||
expect(v.message).toMatch(/\n\nPlugin1: 1/);
|
||||
});
|
||||
|
||||
it('should show a list of three plugins', () => {
|
||||
const plugins: Plugins = {};
|
||||
for (let i = 1; i <= 3; i++) {
|
||||
const plugin: Plugin = new Plugin(
|
||||
'',
|
||||
{
|
||||
manifest_version: i,
|
||||
id: i.toString(),
|
||||
name: `Plugin${i}`,
|
||||
version: '1',
|
||||
app_min_version: '1' },
|
||||
'',
|
||||
() => {},
|
||||
'',
|
||||
);
|
||||
plugins[plugin.manifest.id] = plugin;
|
||||
}
|
||||
|
||||
const v = versionInfo(packageInfo, plugins);
|
||||
|
||||
expect(v.body).toMatch(/\n\nPlugin1: 1\nPlugin2: 1\nPlugin3: 1/);
|
||||
expect(v.message).toMatch(/\n\nPlugin1: 1\nPlugin2: 1\nPlugin3: 1/);
|
||||
});
|
||||
|
||||
it('should show an abridged list of plugins in message and the full list in body', () => {
|
||||
const plugins: Plugins = {};
|
||||
for (let i = 1; i <= 21; i++) {
|
||||
const plugin: Plugin = new Plugin(
|
||||
'',
|
||||
{
|
||||
manifest_version: i,
|
||||
id: i.toString(),
|
||||
name: `Plugin${i}`,
|
||||
version: '1',
|
||||
app_min_version: '1' },
|
||||
'',
|
||||
() => {},
|
||||
'',
|
||||
);
|
||||
|
||||
plugins[plugin.manifest.id] = plugin;
|
||||
}
|
||||
|
||||
const v = versionInfo(packageInfo, plugins);
|
||||
|
||||
const pluginMessage = [];
|
||||
for (let i = 1; i <= 21; i++) {
|
||||
pluginMessage.push(`Plugin${i}: 1`);
|
||||
}
|
||||
// Plugin order should be determined by locale:
|
||||
pluginMessage.sort(Intl.Collator().compare);
|
||||
|
||||
// The body should contain the full plugin list
|
||||
expect(v.body).toContain(pluginMessage.join('\n'));
|
||||
|
||||
// The message should only include the first 20.
|
||||
const nonEllipsizedEntries = pluginMessage.slice(0, 20);
|
||||
expect(v.message).toContain(`${nonEllipsizedEntries.join('\n')}\n...`);
|
||||
});
|
||||
|
||||
it('should show sync target name', () => {
|
||||
const v = versionInfo(packageInfo, {});
|
||||
expect(v.body).toContain('Sync target: (None)');
|
||||
});
|
||||
|
||||
it('should show Markdown editor by default', () => {
|
||||
const v = versionInfo(packageInfo, {});
|
||||
expect(v.body).toContain('Editor: Markdown');
|
||||
});
|
||||
|
||||
it('should show Rich Text editor when codeView is false', () => {
|
||||
const original = Setting.value('editor.codeView');
|
||||
Setting.setValue('editor.codeView', false);
|
||||
try {
|
||||
const v = versionInfo(packageInfo, {});
|
||||
expect(v.body).toContain('Editor: Rich Text');
|
||||
} finally {
|
||||
Setting.setValue('editor.codeView', original);
|
||||
}
|
||||
});
|
||||
});
|
||||
在新工单中引用
屏蔽一个用户