Skip to content

Commit 9e56d77

Browse files
author
Roman Vaivod
committed
gh-157: Add more e2e tests
1 parent 53aa108 commit 9e56d77

18 files changed

Lines changed: 260 additions & 17 deletions

File tree

backend/db_test/test_data.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,3 +260,8 @@ INSERT INTO "Matches"("Id","Team1Player1Id","Team1Player1Rating","Team1Player2Id
260260
INSERT INTO "Matches"("Id","Team1Player1Id","Team1Player1Rating","Team1Player2Id","Team1Player2Rating","Team2Player1Id","Team2Player1Rating","Team2Player2Id","Team2Player2Rating","Date","WinningTeamRatingChange","Team1Won","LosingTeamRatingChange", "GameId") VALUES ('4510','150','823','230','1068','70','1385','210','819','2019-11-06 13:57:41.732','9','false','-9', '3');
261261
INSERT INTO "Matches"("Id","Team1Player1Id","Team1Player1Rating","Team1Player2Id","Team1Player2Rating","Team2Player1Id","Team2Player1Rating","Team2Player2Id","Team2Player2Rating","Date","WinningTeamRatingChange","Team1Won","LosingTeamRatingChange", "GameId") VALUES ('4520','150','814','90','1063','50','950','220','906','2019-11-07 16:15:51.246','16','true','-16', '3');
262262
INSERT INTO "Matches"("Id","Team1Player1Id","Team1Player1Rating","Team1Player2Id","Team1Player2Rating","Team2Player1Id","Team2Player1Rating","Team2Player2Id","Team2Player2Rating","Date","WinningTeamRatingChange","Team1Won","LosingTeamRatingChange", "GameId") VALUES ('4530','90','1079','150','830','240','960','220','890','2019-11-08 12:16:44.265','15','true','-15', '3');
263+
264+
-- Shift Ids' Serials to avoid errors when inserting new rows
265+
ALTER SEQUENCE "Users_Id_seq1" RESTART WITH 300;
266+
ALTER SEQUENCE "Users_Id_seq" RESTART WITH 300;
267+
ALTER SEQUENCE "Matches_Id_seq" RESTART WITH 5000;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { Page } from './Page'
2+
import { Player } from '../types/Player'
3+
import { DashboardPage } from './DashboardPage'
4+
5+
export class AddMatchPage extends Page {
6+
constructor(private gameName: string) {
7+
super(`/${gameName}/create-match`)
8+
}
9+
10+
visit(): AddMatchPage {
11+
super.visit()
12+
return this
13+
}
14+
15+
locate(): void {
16+
super.locate()
17+
this.getContent()
18+
.should('contain.text', 'Team 1')
19+
.should('contain.text', 'Team 2')
20+
}
21+
22+
selectTeam1Player1(player: Player): AddMatchPage {
23+
cy.get('#team1-player-input-0').select(player.name)
24+
return this
25+
}
26+
27+
selectTeam2Player1(player: Player): AddMatchPage {
28+
cy.get('#team2-player-input-0').select(player.name)
29+
return this
30+
}
31+
32+
team1Wins(): DashboardPage {
33+
cy.get('#team1-win-button').click()
34+
return new DashboardPage(this.gameName)
35+
}
36+
}

cypress/integration/pages/CreatePlayerPage.ts renamed to cypress/integration/pages/AddPlayerPage.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { SelectGamePage } from './SelectGamePage'
33
import { Player } from '../types/Player'
44
import { DashboardPage } from './DashboardPage'
55

6-
export class CreatePlayerPage extends Page {
6+
export class AddPlayerPage extends Page {
77
constructor(private gameName: string) {
88
super(`/${gameName}/add-player`)
99
}
1010

11-
visit(): CreatePlayerPage {
11+
visit(): AddPlayerPage {
1212
super.visit()
1313
return this
1414
}
@@ -23,7 +23,7 @@ export class CreatePlayerPage extends Page {
2323
return new DashboardPage(this.gameName)
2424
}
2525

26-
addPlayer(player: Player, score: number): CreatePlayerPage {
26+
addPlayer(player: Player, score: number): AddPlayerPage {
2727
const content = this.getContent()
2828
content.get('#player-name-input').clear().type(player.name)
2929
content

cypress/integration/pages/DashboardPage.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { Page } from './Page'
22
import { SelectGamePage } from './SelectGamePage'
3+
import { AddMatchPage } from './AddMatchPage'
4+
import { MatchListPage } from './MatchListPage'
35
import { LeaderboardPage } from './LeaderboardPage'
46

57
export class DashboardPage extends Page {
@@ -21,11 +23,21 @@ export class DashboardPage extends Page {
2123
.should('contain.text', 'Add Match')
2224
}
2325

26+
goToAddMatch(): AddMatchPage {
27+
cy.get('#add-match-button').click()
28+
return new AddMatchPage(this.gameName)
29+
}
30+
2431
goToGameSelection(): SelectGamePage {
2532
this.getHeader().get('#logo').click()
2633
return new SelectGamePage()
2734
}
2835

36+
goToMatchesList(): MatchListPage {
37+
this.getContent().get('#show-all-matches').click()
38+
return new MatchListPage(this.gameName)
39+
}
40+
2941
goToLeaderboard(): LeaderboardPage {
3042
this.getContent().get('#show-leaderboard').click()
3143
return new LeaderboardPage(this.gameName)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Page } from './Page'
2+
3+
export class MatchListPage extends Page {
4+
constructor(private gameName: string) {
5+
super(`/${gameName}/match-list`)
6+
}
7+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { AddMatchPage } from '../pages/AddMatchPage'
2+
import { FOOSBALL_GAME } from '../utils/data'
3+
import { AddPlayerPage } from '../pages/AddPlayerPage'
4+
import { generateRandomPlayer } from '../utils/gen'
5+
import { LeaderboardPage } from '../pages/LeaderboardPage'
6+
7+
describe('Create match page', () => {
8+
const addMatchPage = new AddMatchPage(FOOSBALL_GAME.name)
9+
before(() => {
10+
addMatchPage.visit()
11+
})
12+
it('renders', () => {
13+
addMatchPage.locate()
14+
})
15+
})
16+
17+
describe('Leaderboard', () => {
18+
const player1 = generateRandomPlayer()
19+
const player1score = 1010
20+
const player1newscore= 1026
21+
const player2 = generateRandomPlayer()
22+
const player2score = 1020
23+
const player2newscore= 1004
24+
describe('when player 1 and player 2 exist in foosball and first wins once over second', () => {
25+
let leaderboard: LeaderboardPage
26+
beforeEach(() => {
27+
leaderboard = new AddPlayerPage(FOOSBALL_GAME.name)
28+
.visit()
29+
.addPlayer(player1, player1score)
30+
.addPlayer(player2, player2score)
31+
.goToSelectGamePage()
32+
.selectGame(FOOSBALL_GAME.name)
33+
.goToAddMatch()
34+
.selectTeam1Player1(player1)
35+
.selectTeam2Player1(player2)
36+
.team1Wins()
37+
.goToLeaderboard()
38+
})
39+
it('contains players with resulting scores', () => {
40+
leaderboard.locatePlayerWithScore(player1, player1newscore)
41+
leaderboard.locatePlayerWithScore(player2, player2newscore)
42+
})
43+
})
44+
})

cypress/integration/tests/add-player.ts

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { CreatePlayerPage } from '../pages/CreatePlayerPage'
2-
import { FOOSBALL_GAME } from '../utils/data'
1+
import { AddPlayerPage } from '../pages/AddPlayerPage'
2+
import { FOOSBALL_GAME, TENNIS_GAME } from '../utils/data'
33
import { Player } from '../types/Player'
44
import { generateRandomPlayer } from '../utils/gen'
55

6-
describe('Create player page', () => {
7-
const addPlayerPage = new CreatePlayerPage(FOOSBALL_GAME.name)
6+
describe('Add player page', () => {
7+
const addPlayerPage = new AddPlayerPage(FOOSBALL_GAME.name)
88
before(() => {
99
addPlayerPage.visit()
1010
})
@@ -26,3 +26,46 @@ describe('Create player page', () => {
2626
})
2727
})
2828
})
29+
30+
describe('A player added to foosball is not added to tennis', () => {
31+
const addPlayerPage = new AddPlayerPage(FOOSBALL_GAME.name)
32+
describe('when a player is added to foosball', () => {
33+
let player: Player
34+
const score = 1001
35+
beforeEach(() => {
36+
player = generateRandomPlayer()
37+
addPlayerPage
38+
.visit()
39+
.addPlayer(player, score)
40+
})
41+
it('is not added to tennis', () => {
42+
addPlayerPage
43+
.goToSelectGamePage()
44+
.selectGame(TENNIS_GAME.name)
45+
.goToLeaderboard()
46+
.missPlayerWithScore(player, score)
47+
})
48+
})
49+
})
50+
51+
describe('Same player can be added to foosball and to tennis', () => {
52+
describe('when a player is added to foosball', () => {
53+
let player: Player
54+
const score = 1001
55+
beforeEach(() => {
56+
player = generateRandomPlayer()
57+
new AddPlayerPage(FOOSBALL_GAME.name)
58+
.visit()
59+
.addPlayer(player, score)
60+
})
61+
it('can be added to tennis', () => {
62+
new AddPlayerPage(TENNIS_GAME.name)
63+
.visit()
64+
.addPlayer(player, score)
65+
.goToSelectGamePage()
66+
.selectGame(TENNIS_GAME.name)
67+
.goToLeaderboard()
68+
.locatePlayerWithScore(player, score)
69+
})
70+
})
71+
})

cypress/integration/tests/dashboard.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import { DashboardPage } from '../pages/DashboardPage'
22

33
describe('Dashboard', () => {
44
const dashboardPage = new DashboardPage('foosball')
5-
beforeEach(() => {
5+
before(() => {
66
dashboardPage.visit()
77
})
8-
it('contains Last Battles and Top Rating titles', () => {
9-
dashboardPage.getContent()
10-
.should('contain.text', 'Last Battles')
11-
.should('contain.text', 'Top Rating')
8+
it('renders', () => {
9+
dashboardPage.locate()
1210
})
1311
})
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { SelectGamePage } from '../pages/SelectGamePage'
2+
3+
describe('Select Game Page', () => {
4+
const selectGamePage = new SelectGamePage()
5+
before(() => {
6+
selectGamePage.visit()
7+
})
8+
it('renders', () => {
9+
selectGamePage.locate()
10+
})
11+
})
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { SelectGamePage } from '../pages/SelectGamePage'
2+
import { FOOSBALL_GAME, TENNIS_GAME } from '../utils/data'
3+
4+
describe('Navigation', () => {
5+
describe('foosball dashboard', () => {
6+
it('is reachable', () => {
7+
new SelectGamePage()
8+
.visit()
9+
.selectGame(FOOSBALL_GAME.name)
10+
.locate()
11+
})
12+
})
13+
14+
describe('foosball add match page', () => {
15+
it('is reachable', () => {
16+
new SelectGamePage()
17+
.visit()
18+
.selectGame(FOOSBALL_GAME.name)
19+
.goToAddMatch()
20+
.locate()
21+
})
22+
})
23+
24+
describe('tennis dashboard after foosball dashboard', () => {
25+
it('is reachable', () => {
26+
new SelectGamePage()
27+
.visit()
28+
.selectGame(FOOSBALL_GAME.name)
29+
.goToGameSelection()
30+
.selectGame(TENNIS_GAME.name)
31+
.locate()
32+
})
33+
})
34+
35+
describe('match list page', () => {
36+
it('is reachable', () => {
37+
new SelectGamePage()
38+
.visit()
39+
.selectGame(FOOSBALL_GAME.name)
40+
.goToMatchesList()
41+
.locate()
42+
})
43+
})
44+
describe('leaderboard page', () => {
45+
it('is reachable', () => {
46+
new SelectGamePage()
47+
.visit()
48+
.selectGame(FOOSBALL_GAME.name)
49+
.goToLeaderboard()
50+
.locate()
51+
})
52+
})
53+
})

0 commit comments

Comments
 (0)