Skip to content

Commit bd586fb

Browse files
committed
Added tests for the edit page
1 parent d6a9a10 commit bd586fb

File tree

5 files changed

+135
-45
lines changed

5 files changed

+135
-45
lines changed

cypress/e2e/edit-page.cy.js

+64-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
describe('Edit Page', () => {
2+
let cookies = {}
3+
24
before(() => {
35
// Log in before each test
46
const accountDetails = {
@@ -14,10 +16,10 @@ describe('Edit Page', () => {
1416
body: accountDetails,
1517
failOnStatusCode: false,
1618
}
17-
)
19+
);
1820

1921
// Wait for the account to be created
20-
cy.wait(100)
22+
cy.wait(100);
2123

2224
cy.request(
2325
{
@@ -26,25 +28,71 @@ describe('Edit Page', () => {
2628
body: accountDetails,
2729
failOnStatusCode: false,
2830
}
29-
)
31+
);
3032

3133
// Wait for the account to be logged in
32-
cy.wait(100)
34+
cy.wait(100);
3335

3436
// Get cookies from login request
35-
cy.getCookies().then((cookies) => {
36-
cookies.forEach((cookie) => {
37-
// Set cookies in browser
38-
cy.setCookie(cookie.name, cookie.value)
39-
})
40-
})
41-
})
37+
cy.getCookies().then((browserCookies) => {
38+
cookies = browserCookies;
39+
});
40+
});
41+
42+
beforeEach(() => {
43+
cookies.forEach((cookie) => {
44+
cy.setCookie(cookie.name, cookie.value)
45+
});
46+
});
47+
48+
afterEach(() => {
49+
cy.getCookies().then((browserCookies) => {
50+
cookies = browserCookies;
51+
});
52+
});
53+
4254

4355
it('Navigates to the edit page', () => {
44-
cy.visit('http://127.0.0.1:3000')
56+
cy.visit('http://127.0.0.1:3000');
57+
58+
cy.wait(1000);
59+
60+
cy.url().should('include', '/note-rack/');
61+
});
62+
63+
it('Edits the page title', () => {
64+
cy.get('[data-cy=page-title]').click();
65+
66+
cy.get('[data-cy=page-title]').type(' - Edited');
67+
68+
cy.get('[data-cy=page-title]').should('have.text', 'New Notebook - Edited');
69+
70+
cy.get('body').click();
71+
72+
cy.wait(2500);
73+
});
74+
75+
it('Creates a new text block', () => {
76+
cy.get('[data-cy=page-title]').click();
77+
78+
cy.get('[data-cy=page-title]').type('{enter}');
79+
80+
cy.get('[data-cy=block-text]').should('have.length', 1);
81+
82+
cy.get('[data-cy=page-title]').click();
83+
84+
cy.wait(2500);
85+
});
86+
87+
it('Edits the text block', () => {
88+
cy.get('[data-cy=block-text]').click();
89+
90+
cy.get('[data-cy=block-text]').type('This is a test');
91+
92+
cy.get('[data-cy=block-text]').should('have.text', 'This is a test');
4593

46-
cy.wait(1000)
94+
cy.get('[data-cy=page-title]').click();
4795

48-
cy.url().should('include', '/note-rack/')
49-
})
50-
})
96+
cy.wait(2500);
97+
});
98+
});

cypress/e2e/login.cy.js

+23-23
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,39 @@
11
describe('Login and Signup Page', () => {
22
it('Navigates to the login page', () => {
3-
cy.visit('http://127.0.0.1:3000')
4-
cy.get('a[href="/login#"]').click()
3+
cy.visit('http://127.0.0.1:3000');
4+
cy.get('a[href="/login#"]').click();
55

6-
cy.url().should('include', '/login')
7-
})
6+
cy.url().should('include', '/login');
7+
});
88

99
it('Switches to the signup page', () => {
10-
cy.visit('http://127.0.0.1:3000/login')
11-
cy.get('button').contains('Sign Up').click()
10+
cy.visit('http://127.0.0.1:3000/login');
11+
cy.get('button').contains('Sign Up').click();
1212

13-
cy.get('button[type="submit"]').contains('Sign up').should('exist')
14-
})
13+
cy.get('button[type="submit"]').contains('Sign up').should('exist');
14+
});
1515

1616
it('Registers with valid credentials', () => {
17-
cy.visit('http://127.0.0.1:3000/login')
18-
cy.get('button[type="button"]').contains('Sign Up').click()
17+
cy.visit('http://127.0.0.1:3000/login');
18+
cy.get('button[type="button"]').contains('Sign Up').click();
1919

20-
cy.get('input[name="username"]').type('test')
21-
cy.get('input[name="email"]').type('[email protected]')
22-
cy.get('input[name="password"]').type('test')
20+
cy.get('input[name="username"]').type('test');
21+
cy.get('input[name="email"]').type('[email protected]');
22+
cy.get('input[name="password"]').type('test');
2323

24-
cy.get('button[type="submit"]').contains('Sign up').click()
24+
cy.get('button[type="submit"]').contains('Sign up').click();
2525

26-
cy.url().should('include', '/login')
27-
})
26+
cy.url().should('include', '/login');
27+
});
2828

2929
it('Logs in with valid credentials', () => {
30-
cy.visit('http://127.0.0.1:3000/login')
30+
cy.visit('http://127.0.0.1:3000/login');
3131

32-
cy.get('input[name="email"]').type('[email protected]')
33-
cy.get('input[name="password"]').type('test')
32+
cy.get('input[name="email"]').type('[email protected]');
33+
cy.get('input[name="password"]').type('test');
3434

35-
cy.get('button[type="submit"]').contains('Log in').click()
35+
cy.get('button[type="submit"]').contains('Log in').click();
3636

37-
cy.url().should('include', '/note-rack/')
38-
})
39-
})
37+
cy.url().should('include', '/note-rack/');
38+
});
39+
});

web/src/classes/SaveManager.ts

+46-6
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,52 @@ class SaveManager {
88
}[],
99
} = {};
1010

11+
private pageSaveData: {
12+
[key: string]: {
13+
type: string,
14+
data: unknown,
15+
}[],
16+
} = {};
17+
1118
static getInstance() {
1219
if (!SaveManager.instance) {
1320
SaveManager.instance = new SaveManager();
1421
}
1522
return SaveManager.instance;
1623
}
1724

18-
public static save(type: string, data: unknown, page: string) {
25+
public static save(type: string, data: unknown, page: string, isPageEdit = false) {
1926
const saveManager = SaveManager.getInstance();
2027

21-
if (!saveManager.saveData[page]) {
22-
saveManager.saveData[page] = [];
28+
if (!isPageEdit) {
29+
if (!saveManager.saveData[page]) {
30+
saveManager.saveData[page] = [];
31+
}
32+
33+
SaveManager.getInstance().saveData[page].push({
34+
type,
35+
data,
36+
});
37+
return;
38+
}
39+
40+
if (!saveManager.pageSaveData[page]) {
41+
saveManager.pageSaveData[page] = [];
2342
}
2443

25-
SaveManager.getInstance().saveData[page].push({
44+
SaveManager.getInstance().pageSaveData[page].push({
2645
type,
2746
data,
2847
});
2948
}
3049

3150
public static async sendToServer() {
3251
const saveManager = SaveManager.getInstance();
33-
const { saveData } = saveManager;
52+
const { saveData, pageSaveData } = saveManager;
3453

35-
if (!Object.keys(saveData).length) return;
54+
if (!Object.keys(saveData).length || !Object.keys(pageSaveData).length) {
55+
return;
56+
}
3657

3758
Object.keys(saveData).forEach(async (page) => {
3859
const data = saveData[page];
@@ -52,6 +73,25 @@ class SaveManager {
5273
saveManager.saveData[page] = [];
5374
}
5475
});
76+
77+
Object.keys(pageSaveData).forEach(async (page) => {
78+
const data = pageSaveData[page];
79+
80+
if (!data.length) return;
81+
82+
const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/page/modify/${page}`, {
83+
method: 'POST',
84+
headers: { 'Content-Type': 'application/json' },
85+
credentials: 'include',
86+
body: JSON.stringify({
87+
operations: data,
88+
}),
89+
});
90+
91+
if (response.status === 200) {
92+
saveManager.pageSaveData[page] = [];
93+
}
94+
});
5595
}
5696
}
5797

web/src/components/blocks/TextBlock.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ const TextBlock = (props: EditableText) => {
7878
onCopy={() => {
7979
navigator.clipboard.writeText(window.getSelection()?.toString() || '');
8080
}}
81+
data-cy="block-text"
8182
>
8283
{value}
8384
</span>

web/src/components/blocks/Title.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ const Title = (props: TitleProps) => {
7676
document.dispatchEvent(new CustomEvent('changePageTitle', { detail: { newTitle: e.currentTarget.innerText } }));
7777
}
7878
}
79+
data-cy="page-title"
7980
>
8081
{title}
8182
</span>

0 commit comments

Comments
 (0)