test: add test case for upload image (#1250)

This commit is contained in:
Himself65
2023-03-01 23:51:15 -06:00
committed by GitHub
parent e5a6fd8f6c
commit f34a64a82a
7 changed files with 60 additions and 10 deletions

View File

@@ -63,6 +63,7 @@ export const GeneralPanel: React.FC<PanelProps> = ({
<Upload <Upload
accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"
fileChange={fileChange} fileChange={fileChange}
data-testid="upload-avatar"
> >
<> <>
<div className="camera-icon"> <div className="camera-icon">

View File

@@ -48,6 +48,7 @@ export const CreateWorkspaceModal = ({
<ContentTitle>{t('New Workspace')}</ContentTitle> <ContentTitle>{t('New Workspace')}</ContentTitle>
<p>{t('Workspace description')}</p> <p>{t('Workspace description')}</p>
<Input <Input
data-testid="create-workspace-input"
onKeyDown={handleKeyDown} onKeyDown={handleKeyDown}
placeholder={t('Set a Workspace name')} placeholder={t('Set a Workspace name')}
maxLength={15} maxLength={15}
@@ -63,6 +64,7 @@ export const CreateWorkspaceModal = ({
}} }}
/> />
<Button <Button
data-testid="create-workspace-button"
disabled={!workspaceName} disabled={!workspaceName}
style={{ style={{
width: '260px', width: '260px',

View File

@@ -13,6 +13,7 @@ export const Upload: React.FC<UploadProps> = ({
fileChange, fileChange,
accept, accept,
children, children,
...props
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const input_ref = useRef<HTMLInputElement>(null); const input_ref = useRef<HTMLInputElement>(null);
@@ -41,6 +42,7 @@ export const Upload: React.FC<UploadProps> = ({
style={{ display: 'none' }} style={{ display: 'none' }}
onChange={_handleInputChange} onChange={_handleInputChange}
accept={accept} accept={accept}
{...props}
/> />
</UploadStyle> </UploadStyle>
); );

View File

@@ -12,16 +12,17 @@ interface AvatarProps {
} }
export const Avatar: React.FC<AvatarProps> = React.memo<AvatarProps>( export const Avatar: React.FC<AvatarProps> = React.memo<AvatarProps>(
function Avatar(props) { function Avatar({ size: _size, avatar_url, style, name, ...props }) {
const size = props.size || 20; const size = _size || 20;
const sizeStr = size + 'px'; const sizeStr = size + 'px';
return ( return (
<> <>
{props.avatar_url ? ( {avatar_url ? (
<div <div
{...props}
style={{ style={{
...props.style, ...style,
width: sizeStr, width: sizeStr,
height: sizeStr, height: sizeStr,
color: '#fff', color: '#fff',
@@ -34,7 +35,7 @@ export const Avatar: React.FC<AvatarProps> = React.memo<AvatarProps>(
<picture> <picture>
<img <img
style={{ width: sizeStr, height: sizeStr }} style={{ width: sizeStr, height: sizeStr }}
src={props.avatar_url} src={avatar_url}
alt="" alt=""
referrerPolicy="no-referrer" referrerPolicy="no-referrer"
/> />
@@ -42,14 +43,15 @@ export const Avatar: React.FC<AvatarProps> = React.memo<AvatarProps>(
</div> </div>
) : ( ) : (
<div <div
{...props}
style={{ style={{
...props.style, ...style,
width: sizeStr, width: sizeStr,
height: sizeStr, height: sizeStr,
border: '1px solid #fff', border: '1px solid #fff',
color: '#fff', color: '#fff',
fontSize: Math.ceil(0.5 * size) + 'px', fontSize: Math.ceil(0.5 * size) + 'px',
background: stringToColour(props.name || 'AFFiNE'), background: stringToColour(name || 'AFFiNE'),
borderRadius: '50%', borderRadius: '50%',
textAlign: 'center', textAlign: 'center',
lineHeight: size + 'px', lineHeight: size + 'px',
@@ -57,7 +59,7 @@ export const Avatar: React.FC<AvatarProps> = React.memo<AvatarProps>(
verticalAlign: 'middle', verticalAlign: 'middle',
}} }}
> >
{(props.name || 'AFFiNE').substring(0, 1)} {(name || 'AFFiNE').substring(0, 1)}
</div> </div>
)} )}
</> </>
@@ -82,10 +84,12 @@ export const BlockSuiteWorkspaceAvatar: React.FC<BlockSuiteWorkspaceAvatar> = ({
size = 20, size = 20,
workspace, workspace,
style, style,
...props
}) => { }) => {
const avatarURL = useWorkspaceBlobImage(workspace.meta.avatar, workspace); const avatarURL = useWorkspaceBlobImage(workspace.meta.avatar, workspace);
return ( return (
<Avatar <Avatar
{...props}
size={size} size={size}
name={workspace.meta.name} name={workspace.meta.name}
avatar_url={avatarURL ?? ''} avatar_url={avatarURL ?? ''}
@@ -110,5 +114,7 @@ export const WorkspaceAvatar: React.FC<WorkspaceUnitAvatarProps> = ({
/> />
); );
} }
return <Avatar size={size} name="UNKNOWN" avatar_url="" style={style} />; return (
<Avatar {...props} size={size} name="UNKNOWN" avatar_url="" style={style} />
);
}; };

View File

@@ -99,7 +99,7 @@ export const WorkspaceListModal = ({
/> />
); );
})} })}
<StyledCard onClick={onCreateWorkspace}> <StyledCard data-testid="new-workspace" onClick={onCreateWorkspace}>
<StyleWorkspaceAdd className="add-icon"> <StyleWorkspaceAdd className="add-icon">
<PlusIcon /> <PlusIcon />
</StyleWorkspaceAdd> </StyleWorkspaceAdd>

BIN
tests/fixtures/smile.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 B

View File

@@ -0,0 +1,39 @@
import { expect } from '@playwright/test';
import { loadPage } from './libs/load-page';
import { newPage } from './libs/page-logic';
import { test } from './libs/playwright';
loadPage();
test.describe('Local first create page', () => {
test('should create a page with a local first avatar', async ({ page }) => {
await newPage(page);
await page.getByTestId('workspace-name').click();
await page.getByTestId('new-workspace').click({ delay: 50 });
await page
.getByTestId('create-workspace-input')
.type('Test Workspace 1', { delay: 50 });
await page.getByTestId('create-workspace-button').click();
await page.getByTestId('workspace-name').click();
await page.getByTestId('workspace-card').nth(1).click();
await page.getByText('Workspace Setting').click();
await page
.getByTestId('upload-avatar')
.setInputFiles('./tests/fixtures/smile.png');
await page.getByTestId('workspace-name').click();
await page.getByTestId('workspace-card').nth(0).click();
await page.waitForTimeout(1000);
const text = await page.getByTestId('workspace-avatar').textContent();
// default avatar for default workspace
expect(text).toBe('U');
await page.getByTestId('workspace-name').click();
await page.getByTestId('workspace-card').nth(1).click();
const blobUrl = await page
.getByTestId('workspace-avatar')
.locator('img')
.getAttribute('src');
// out user uploaded avatar
expect(blobUrl).toContain('blob:');
});
});