From 8a0a46b1c98de86cdae4b50cad4c9b36b21b0027 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Sun, 19 Sep 2021 14:27:16 +0900
Subject: [PATCH] test: improve e2e test

---
 cypress/integration/basic.js | 200 +++++++++++++++++++++--------------
 1 file changed, 119 insertions(+), 81 deletions(-)

diff --git a/cypress/integration/basic.js b/cypress/integration/basic.js
index fefc64baa0..182f70ff68 100644
--- a/cypress/integration/basic.js
+++ b/cypress/integration/basic.js
@@ -1,4 +1,4 @@
-describe('Basic', () => {
+describe('Before setup instance', () => {
 	beforeEach(() => {
 		cy.request('POST', '/api/reset-db').as('reset');
 		cy.get('@reset').its('status').should('equal', 204);
@@ -28,97 +28,116 @@ describe('Basic', () => {
 		//cy.wait('@signup').should('have.property', 'response.statusCode');
 		cy.wait('@signup');
   });
+});
+
+describe('After setup instance', () => {
+	beforeEach(() => {
+		cy.request('POST', '/api/reset-db').as('reset');
+		cy.get('@reset').its('status').should('equal', 204);
+		cy.reload(true);
 
-	it('signup', () => {
 		// インスタンス初期セットアップ
 		cy.request('POST', '/api/admin/accounts/create', {
 			username: 'admin',
 			password: 'pass',
-		}).as('setup');
+		}).its('body').as('admin');
 
-		cy.get('@setup').then(() => {
-			cy.visit('/');
+		cy.get('@admin');
+	});
 
-			cy.intercept('POST', '/api/signup').as('signup');
+	afterEach(() => {
+		// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
+		// waitを入れることでそれを防止できる
+		cy.wait(1000);
+	});
 
-			cy.get('[data-cy-signup]').click();
-			cy.get('[data-cy-signup-username] input').type('alice');
-			cy.get('[data-cy-signup-password] input').type('alice1234');
-			cy.get('[data-cy-signup-password-retype] input').type('alice1234');
-			cy.get('[data-cy-signup-submit]').click();
+  it('successfully loads', () => {
+    cy.visit('/');
+  });
 
-			cy.wait('@signup');
+	it('signup', () => {
+		cy.visit('/');
+
+		cy.intercept('POST', '/api/signup').as('signup');
+
+		cy.get('[data-cy-signup]').click();
+		cy.get('[data-cy-signup-username] input').type('alice');
+		cy.get('[data-cy-signup-password] input').type('alice1234');
+		cy.get('[data-cy-signup-password-retype] input').type('alice1234');
+		cy.get('[data-cy-signup-submit]').click();
+
+		cy.wait('@signup');
+  });
+});
+
+describe('After user signup', () => {
+	beforeEach(() => {
+		cy.request('POST', '/api/reset-db').as('reset');
+		cy.get('@reset').its('status').should('equal', 204);
+		cy.reload(true);
+
+		// インスタンス初期セットアップ
+		cy.request('POST', '/api/admin/accounts/create', {
+			username: 'admin',
+			password: 'pass',
+		}).its('body').as('admin');
+
+		cy.get('@admin').then(() => {
+			// ユーザー作成
+			cy.request('POST', '/api/signup', {
+				username: 'alice',
+				password: 'alice1234',
+			}).its('body').as('alice');
 		});
+
+		cy.get('@alice');
+	});
+
+	afterEach(() => {
+		// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
+		// waitを入れることでそれを防止できる
+		cy.wait(1000);
+	});
+
+  it('successfully loads', () => {
+    cy.visit('/');
   });
 
 	it('signin', () => {
-		// インスタンス初期セットアップ
-		cy.request('POST', '/api/admin/accounts/create', {
-			username: 'admin',
-			password: 'pass',
-		}).as('setup');
+		cy.visit('/');
 
-		cy.get('@setup').then(() => {
-			// ユーザー作成
-			cy.request('POST', '/api/signup', {
-				username: 'alice',
-				password: 'alice1234',
-			}).as('signup');
-		});
+		cy.intercept('POST', '/api/signin').as('signin');
 
-		cy.get('@signup').then(() => {
-			cy.visit('/');
+		cy.get('[data-cy-signin]').click();
+		cy.get('[data-cy-signin-username] input').type('alice');
+		// Enterキーでサインインできるかの確認も兼ねる
+		cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
 
-			cy.intercept('POST', '/api/signin').as('signin');
-
-			cy.get('[data-cy-signin]').click();
-			cy.get('[data-cy-signin-username] input').type('alice');
-			// Enterキーでサインインできるかの確認も兼ねる
-			cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
-
-			cy.wait('@signin');
-		});
-  });
-
-	it('note', () => {
-    cy.visit('/');
-
-		// インスタンス初期セットアップ
-		cy.request('POST', '/api/admin/accounts/create', {
-			username: 'admin',
-			password: 'pass',
-		}).as('setup');
-
-		cy.get('@setup').then(() => {
-			// ユーザー作成
-			cy.request('POST', '/api/signup', {
-				username: 'alice',
-				password: 'alice1234',
-			}).as('signup');
-		});
-
-		cy.get('@signup').then(() => {
-			cy.visit('/');
-
-			cy.intercept('POST', '/api/signin').as('signin');
-
-			cy.get('[data-cy-signin]').click();
-			cy.get('[data-cy-signin-username] input').type('alice');
-			cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
-
-			cy.wait('@signin').as('signinEnd');
-		});
-
-		cy.get('@signinEnd').then(() => {
-			cy.get('[data-cy-open-post-form]').click();
-			cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
-			cy.get('[data-cy-open-post-form-submit]').click();
-
-			cy.contains('Hello, Misskey!');
-		});
+		cy.wait('@signin');
   });
 
 	it('suspend', function() {
+		cy.request('POST', '/api/admin/suspend-user', {
+			i: this.admin.token,
+			userId: this.alice.id,
+		});
+
+		cy.visit('/');
+
+		cy.get('[data-cy-signin]').click();
+		cy.get('[data-cy-signin-username] input').type('alice');
+		cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
+
+		cy.contains('アカウントが凍結されています');
+	});
+});
+
+describe('After user singed in', () => {
+	beforeEach(() => {
+		cy.request('POST', '/api/reset-db').as('reset');
+		cy.get('@reset').its('status').should('equal', 204);
+		cy.reload(true);
+
 		// インスタンス初期セットアップ
 		cy.request('POST', '/api/admin/accounts/create', {
 			username: 'admin',
@@ -134,18 +153,37 @@ describe('Basic', () => {
 		});
 
 		cy.get('@alice').then(() => {
-			cy.request('POST', '/api/admin/suspend-user', {
-				i: this.admin.token,
-				userId: this.alice.id,
-			});
-	
 			cy.visit('/');
-	
+
+			cy.intercept('POST', '/api/signin').as('signin');
+
 			cy.get('[data-cy-signin]').click();
 			cy.get('[data-cy-signin-username] input').type('alice');
 			cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
-	
-			cy.contains('アカウントが凍結されています');
+
+			cy.wait('@signin').as('signedIn');
 		});
+
+		cy.get('@signedIn');
 	});
+
+	afterEach(() => {
+		// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
+		// waitを入れることでそれを防止できる
+		cy.wait(1000);
+	});
+
+  it('successfully loads', () => {
+    cy.visit('/');
+  });
+
+	it('note', () => {
+    cy.visit('/');
+
+		cy.get('[data-cy-open-post-form]').click();
+		cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
+		cy.get('[data-cy-open-post-form-submit]').click();
+
+		cy.contains('Hello, Misskey!');
+  });
 });