mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-23 20:18:42 +08:00
test(core): add basic tests for template doc setting (#9702)
close AF-2112, AF-2114, AF-2115
This commit is contained in:
@@ -162,7 +162,7 @@ export const WeekDatePicker = memo(function WeekDatePicker({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={clsx(styles.weekDatePicker, className)} {...attrs}>
|
<div className={clsx(styles.weekDatePicker, className)} {...attrs}>
|
||||||
<IconButton onClick={onPrev}>
|
<IconButton onClick={onPrev} data-testid="week-picker-prev">
|
||||||
<ArrowLeftSmallIcon />
|
<ArrowLeftSmallIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@ export const WeekDatePicker = memo(function WeekDatePicker({
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<IconButton onClick={onNext}>
|
<IconButton onClick={onNext} data-testid="week-picker-next">
|
||||||
<ArrowRightSmallIcon />
|
<ArrowRightSmallIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</div>
|
</div>
|
||||||
@@ -204,6 +204,7 @@ const Cell = ({ day, dense, value, cursor, onClick }: CellProps) => {
|
|||||||
return (
|
return (
|
||||||
<button
|
<button
|
||||||
tabIndex={cursor.isSame(day, 'day') ? 0 : -1}
|
tabIndex={cursor.isSame(day, 'day') ? 0 : -1}
|
||||||
|
data-testid="week-picker-day"
|
||||||
aria-label={day.format(format)}
|
aria-label={day.format(format)}
|
||||||
data-active={isActive}
|
data-active={isActive}
|
||||||
data-curr-month={isCurrentMonth}
|
data-curr-month={isCurrentMonth}
|
||||||
|
|||||||
@@ -37,7 +37,11 @@ export const TemplateDocEntrance = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SidebarMenuItem icon={<TemplateOutlineIcon />} onClick={toggleMenu}>
|
<SidebarMenuItem
|
||||||
|
data-testid="sidebar-template-doc-entrance"
|
||||||
|
icon={<TemplateOutlineIcon />}
|
||||||
|
onClick={toggleMenu}
|
||||||
|
>
|
||||||
<Menu
|
<Menu
|
||||||
rootOptions={{ open: menuOpen, onOpenChange: setMenuOpen }}
|
rootOptions={{ open: menuOpen, onOpenChange: setMenuOpen }}
|
||||||
contentOptions={{
|
contentOptions={{
|
||||||
@@ -79,6 +83,7 @@ const CreateNewTemplateMenuItem = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<MenuItem
|
<MenuItem
|
||||||
|
data-testid="template-doc-item-create"
|
||||||
prefixIcon={<TemplateIcon />}
|
prefixIcon={<TemplateIcon />}
|
||||||
onClick={createNewTemplate}
|
onClick={createNewTemplate}
|
||||||
onAuxClick={createNewTemplate}
|
onAuxClick={createNewTemplate}
|
||||||
|
|||||||
+6
-2
@@ -332,7 +332,7 @@ const NewDocDefaultModeSettings = () => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'ask',
|
value: 'ask',
|
||||||
label: 'Ask every time',
|
label: t['com.affine.settings.editorSettings.ask-me-every-time'](),
|
||||||
testId: 'ask-every-time-trigger',
|
testId: 'ask-every-time-trigger',
|
||||||
},
|
},
|
||||||
] as const,
|
] as const,
|
||||||
@@ -361,13 +361,17 @@ const NewDocDefaultModeSettings = () => {
|
|||||||
key={item.value}
|
key={item.value}
|
||||||
selected={item.value === settings.newDocDefaultMode}
|
selected={item.value === settings.newDocDefaultMode}
|
||||||
onSelect={() => updateNewDocDefaultMode(item.value)}
|
onSelect={() => updateNewDocDefaultMode(item.value)}
|
||||||
|
data-testid={item.testId}
|
||||||
>
|
>
|
||||||
{item.label}
|
{item.label}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<MenuTrigger className={styles.menuTrigger}>
|
<MenuTrigger
|
||||||
|
className={styles.menuTrigger}
|
||||||
|
data-testid="new-doc-default-mode-trigger"
|
||||||
|
>
|
||||||
{items.find(item => item.value === settings.newDocDefaultMode)?.label}
|
{items.find(item => item.value === settings.newDocDefaultMode)?.label}
|
||||||
</MenuTrigger>
|
</MenuTrigger>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|||||||
+15
-3
@@ -64,6 +64,7 @@ export const TemplateDocSetting = () => {
|
|||||||
desc={t['com.affine.settings.workspace.template.journal-desc']()}
|
desc={t['com.affine.settings.workspace.template.journal-desc']()}
|
||||||
>
|
>
|
||||||
<TemplateSelector
|
<TemplateSelector
|
||||||
|
testId="journal-template-selector"
|
||||||
current={journalTemplateDocId}
|
current={journalTemplateDocId}
|
||||||
onChange={updateJournalTemplate}
|
onChange={updateJournalTemplate}
|
||||||
/>
|
/>
|
||||||
@@ -72,7 +73,11 @@ export const TemplateDocSetting = () => {
|
|||||||
name={t['com.affine.settings.workspace.template.page']()}
|
name={t['com.affine.settings.workspace.template.page']()}
|
||||||
desc={t['com.affine.settings.workspace.template.page-desc']()}
|
desc={t['com.affine.settings.workspace.template.page-desc']()}
|
||||||
>
|
>
|
||||||
<Switch checked={enablePageTemplate} onChange={togglePageTemplate} />
|
<Switch
|
||||||
|
data-testid="page-template-switch"
|
||||||
|
checked={enablePageTemplate}
|
||||||
|
onChange={togglePageTemplate}
|
||||||
|
/>
|
||||||
</SettingRow>
|
</SettingRow>
|
||||||
{enablePageTemplate ? (
|
{enablePageTemplate ? (
|
||||||
<SettingRow
|
<SettingRow
|
||||||
@@ -80,6 +85,7 @@ export const TemplateDocSetting = () => {
|
|||||||
desc={t['com.affine.settings.workspace.template.journal-desc']()}
|
desc={t['com.affine.settings.workspace.template.journal-desc']()}
|
||||||
>
|
>
|
||||||
<TemplateSelector
|
<TemplateSelector
|
||||||
|
testId="page-template-selector"
|
||||||
current={pageTemplateDocId}
|
current={pageTemplateDocId}
|
||||||
onChange={updatePageTemplate}
|
onChange={updatePageTemplate}
|
||||||
/>
|
/>
|
||||||
@@ -91,9 +97,14 @@ export const TemplateDocSetting = () => {
|
|||||||
|
|
||||||
interface TemplateSelectorProps {
|
interface TemplateSelectorProps {
|
||||||
current?: string;
|
current?: string;
|
||||||
|
testId?: string;
|
||||||
onChange?: (id?: string) => void;
|
onChange?: (id?: string) => void;
|
||||||
}
|
}
|
||||||
const TemplateSelector = ({ current, onChange }: TemplateSelectorProps) => {
|
const TemplateSelector = ({
|
||||||
|
current,
|
||||||
|
testId,
|
||||||
|
onChange,
|
||||||
|
}: TemplateSelectorProps) => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const docsService = useService(DocsService);
|
const docsService = useService(DocsService);
|
||||||
const docDisplayService = useService(DocDisplayMetaService);
|
const docDisplayService = useService(DocDisplayMetaService);
|
||||||
@@ -112,13 +123,14 @@ const TemplateSelector = ({ current, onChange }: TemplateSelectorProps) => {
|
|||||||
prefixIcon={<DeleteIcon className={styles.menuItemIcon} />}
|
prefixIcon={<DeleteIcon className={styles.menuItemIcon} />}
|
||||||
onClick={() => onChange?.()}
|
onClick={() => onChange?.()}
|
||||||
type="danger"
|
type="danger"
|
||||||
|
data-testid="template-doc-item-remove"
|
||||||
>
|
>
|
||||||
{t['com.affine.settings.workspace.template.remove']()}
|
{t['com.affine.settings.workspace.template.remove']()}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<MenuTrigger className={styles.menuTrigger}>
|
<MenuTrigger className={styles.menuTrigger} data-testid={testId}>
|
||||||
{/* TODO: in trash design */}
|
{/* TODO: in trash design */}
|
||||||
{title ?? t['com.affine.settings.workspace.template.keep-empty']()}
|
{title ?? t['com.affine.settings.workspace.template.keep-empty']()}
|
||||||
</MenuTrigger>
|
</MenuTrigger>
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ function AddPageWithAsk({ className, style }: AddPageButtonProps) {
|
|||||||
<Button
|
<Button
|
||||||
tooltip={t['New Page']()}
|
tooltip={t['New Page']()}
|
||||||
tooltipOptions={sideBottom}
|
tooltipOptions={sideBottom}
|
||||||
data-testid="sidebar-new-page-button"
|
data-testid="sidebar-new-page-with-ask-button"
|
||||||
className={clsx([styles.withAskRoot, className])}
|
className={clsx([styles.withAskRoot, className])}
|
||||||
style={style}
|
style={style}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -27,7 +27,11 @@ const DocItem = ({ doc, onSelect }: DocItemProps) => {
|
|||||||
}, [doc.id, onSelect]);
|
}, [doc.id, onSelect]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MenuItem prefixIcon={<Icon />} onClick={onClick}>
|
<MenuItem
|
||||||
|
prefixIcon={<Icon />}
|
||||||
|
onClick={onClick}
|
||||||
|
data-testid={`template-doc-item-${doc.id}`}
|
||||||
|
>
|
||||||
{title}
|
{title}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1251,6 +1251,7 @@
|
|||||||
"com.affine.settings.editorSettings.preferences.import.title": "Import Settings",
|
"com.affine.settings.editorSettings.preferences.import.title": "Import Settings",
|
||||||
"com.affine.settings.editorSettings.subtitle": "Configure your own editor",
|
"com.affine.settings.editorSettings.subtitle": "Configure your own editor",
|
||||||
"com.affine.settings.editorSettings.title": "Editor settings",
|
"com.affine.settings.editorSettings.title": "Editor settings",
|
||||||
|
"com.affine.settings.editorSettings.ask-me-every-time": "Ask me every time",
|
||||||
"com.affine.settings.email": "Email",
|
"com.affine.settings.email": "Email",
|
||||||
"com.affine.settings.email.action": "Change email",
|
"com.affine.settings.email.action": "Change email",
|
||||||
"com.affine.settings.email.action.change": "Change email",
|
"com.affine.settings.email.action.change": "Change email",
|
||||||
|
|||||||
@@ -65,6 +65,23 @@ const createDocAndMarkAsTemplate = async (
|
|||||||
await onCreated?.();
|
await onCreated?.();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const getDocId = async (page: Page) => {
|
||||||
|
const docId = await page.evaluate(() => {
|
||||||
|
const url = window.location.href;
|
||||||
|
const id = url.split('/').pop()?.split('?')[0];
|
||||||
|
return id;
|
||||||
|
});
|
||||||
|
return docId;
|
||||||
|
};
|
||||||
|
|
||||||
|
const enableAskMeEveryTime = async (page: Page) => {
|
||||||
|
await page.getByTestId('slider-bar-workspace-setting-button').click();
|
||||||
|
await page.getByTestId('editor-panel-trigger').click();
|
||||||
|
await page.getByTestId('new-doc-default-mode-trigger').click();
|
||||||
|
await page.getByTestId('ask-every-time-trigger').click();
|
||||||
|
await page.keyboard.press('Escape');
|
||||||
|
};
|
||||||
|
|
||||||
test('create a doc and mark it as template', async ({ page }) => {
|
test('create a doc and mark it as template', async ({ page }) => {
|
||||||
await openHomePage(page);
|
await openHomePage(page);
|
||||||
await createDocAndMarkAsTemplate(page, 'Test Template', async () => {
|
await createDocAndMarkAsTemplate(page, 'Test Template', async () => {
|
||||||
@@ -92,3 +109,145 @@ test('create a doc, and initialize it from template', async ({ page }) => {
|
|||||||
// the starter bar should be hidden
|
// the starter bar should be hidden
|
||||||
await expect(page.getByTestId('template-docs-badge')).not.toBeVisible();
|
await expect(page.getByTestId('template-docs-badge')).not.toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('enable ask me every time for new doc', async ({ page }) => {
|
||||||
|
const withAskButton = page.getByTestId('sidebar-new-page-with-ask-button');
|
||||||
|
const withoutAskButton = page.getByTestId('sidebar-new-page-button');
|
||||||
|
|
||||||
|
await openHomePage(page);
|
||||||
|
await expect(withAskButton).not.toBeVisible();
|
||||||
|
await expect(withoutAskButton).toBeVisible();
|
||||||
|
|
||||||
|
await enableAskMeEveryTime(page);
|
||||||
|
await expect(withAskButton).toBeVisible();
|
||||||
|
await expect(withoutAskButton).not.toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default template for page', async ({ page }) => {
|
||||||
|
await openHomePage(page);
|
||||||
|
await createDocAndMarkAsTemplate(page, 'Test Template', async () => {
|
||||||
|
await page.keyboard.type('# Template');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
|
await page.keyboard.type('This is a template doc');
|
||||||
|
});
|
||||||
|
const templateDocId = await getDocId(page);
|
||||||
|
|
||||||
|
// create a new page, should not inherit template
|
||||||
|
await page.getByTestId('sidebar-new-page-button').click();
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
await expect(page.getByText('This is a template doc')).not.toBeVisible();
|
||||||
|
|
||||||
|
// enable page template and set a template
|
||||||
|
await page.getByTestId('slider-bar-workspace-setting-button').click();
|
||||||
|
await page.getByTestId('workspace-setting:preference').click();
|
||||||
|
const pageTemplateSwitch = page.getByTestId('page-template-switch');
|
||||||
|
await pageTemplateSwitch.click();
|
||||||
|
const pageTemplateSelector = page.getByTestId('page-template-selector');
|
||||||
|
await expect(pageTemplateSelector).toBeVisible();
|
||||||
|
await pageTemplateSelector.click();
|
||||||
|
await page.getByTestId(`template-doc-item-${templateDocId}`).click();
|
||||||
|
|
||||||
|
// close setting, create a new page from sidebar
|
||||||
|
await page.getByTestId('modal-close-button').click();
|
||||||
|
await page.getByTestId('sidebar-new-page-button').click();
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
await expect(page.getByText('This is a template doc')).toBeVisible();
|
||||||
|
|
||||||
|
// remove template
|
||||||
|
await page.getByTestId('slider-bar-workspace-setting-button').click();
|
||||||
|
await page.getByTestId('workspace-setting:preference').click();
|
||||||
|
await page.getByTestId('page-template-selector').click();
|
||||||
|
await page.getByTestId('template-doc-item-remove').click();
|
||||||
|
|
||||||
|
// close setting, create a new page from sidebar
|
||||||
|
await page.getByTestId('modal-close-button').click();
|
||||||
|
await page.getByTestId('sidebar-new-page-button').click();
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
await expect(page.getByText('This is a template doc')).not.toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default template for journal', async ({ page }) => {
|
||||||
|
await openHomePage(page);
|
||||||
|
await createDocAndMarkAsTemplate(page, 'Page Template', async () => {
|
||||||
|
await page.keyboard.type('# Page Template');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
|
await page.keyboard.type('This is a page template doc');
|
||||||
|
});
|
||||||
|
const pageTemplateDocId = await getDocId(page);
|
||||||
|
await createDocAndMarkAsTemplate(page, 'Journal Template', async () => {
|
||||||
|
await page.keyboard.type('# Journal Template');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
|
await page.keyboard.type('This is a journal template doc');
|
||||||
|
});
|
||||||
|
const journalTemplateDocId = await getDocId(page);
|
||||||
|
|
||||||
|
// by default create a journal, should not use template
|
||||||
|
await page.getByTestId('slider-bar-journals-button').click();
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
await expect(
|
||||||
|
page.getByText('This is a journal template doc')
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByText('This is a page template doc')).not.toBeVisible();
|
||||||
|
|
||||||
|
// enable page template, new journal should use page template
|
||||||
|
await page.getByTestId('slider-bar-workspace-setting-button').click();
|
||||||
|
await page.getByTestId('workspace-setting:preference').click();
|
||||||
|
await page.getByTestId('page-template-switch').click();
|
||||||
|
await page.getByTestId('page-template-selector').click();
|
||||||
|
await page.getByTestId(`template-doc-item-${pageTemplateDocId}`).click();
|
||||||
|
await page.getByTestId('modal-close-button').click();
|
||||||
|
// create a new journal
|
||||||
|
const prevWeekButton = page.getByTestId('week-picker-prev');
|
||||||
|
await prevWeekButton.click();
|
||||||
|
await page.getByTestId('week-picker-day').first().click();
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
await expect(page.getByText('This is a page template doc')).toBeVisible();
|
||||||
|
|
||||||
|
// set journal template, new journal should use journal template
|
||||||
|
await page.getByTestId('slider-bar-workspace-setting-button').click();
|
||||||
|
await page.getByTestId('workspace-setting:preference').click();
|
||||||
|
await page.getByTestId('journal-template-selector').click();
|
||||||
|
await page.getByTestId(`template-doc-item-${journalTemplateDocId}`).click();
|
||||||
|
await page.getByTestId('modal-close-button').click();
|
||||||
|
// create a new journal
|
||||||
|
await prevWeekButton.click();
|
||||||
|
await page.getByTestId('week-picker-day').first().click();
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
await expect(page.getByText('This is a journal template doc')).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('create doc from template via sidebar entrance', async ({ page }) => {
|
||||||
|
await openHomePage(page);
|
||||||
|
await createDocAndMarkAsTemplate(page, 'Test Template', async () => {
|
||||||
|
await page.keyboard.type('# Template');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
|
await page.keyboard.type('This is a template doc');
|
||||||
|
});
|
||||||
|
const templateDocId = await getDocId(page);
|
||||||
|
|
||||||
|
await page.getByTestId('sidebar-new-page-button').click();
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
await expect(page.getByText('This is a template doc')).not.toBeVisible();
|
||||||
|
|
||||||
|
await page.getByTestId('sidebar-template-doc-entrance').click();
|
||||||
|
await page.getByTestId(`template-doc-item-${templateDocId}`).click();
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
await expect(page.getByText('This is a template doc')).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('create template from sidebar template entrance', async ({ page }) => {
|
||||||
|
await openHomePage(page);
|
||||||
|
await page.getByTestId('sidebar-template-doc-entrance').click();
|
||||||
|
await page.getByTestId('template-doc-item-create').click();
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
|
||||||
|
await page.locator('affine-note').first().click();
|
||||||
|
await page.keyboard.press('Backspace');
|
||||||
|
await page.keyboard.type('Template');
|
||||||
|
const templateDocId = await getDocId(page);
|
||||||
|
|
||||||
|
await page.getByTestId('sidebar-template-doc-entrance').click();
|
||||||
|
await expect(
|
||||||
|
page.getByTestId(`template-doc-item-${templateDocId}`)
|
||||||
|
).toBeVisible();
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user