Skip to content

Commit

Permalink
add register tests
Browse files Browse the repository at this point in the history
  • Loading branch information
jdmcd committed Jun 15, 2018
1 parent d01330d commit 8e773dd
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,12 @@ class RegisterViewController: RouteCollection {

let hashedPassword = try BCrypt.hash(content.password)
let newUser = User(name: content.name, email: content.email, password: hashedPassword)
try newUser.validate()

let response = req.redirect(to: "/home").flash(.success, "Successfully registered")
return newUser.save(on: req).transform(to: response)
}.catchMap { error in
return req.redirect(to: "/register").flash(.success, "Invalid email")
}
}
}
1 change: 1 addition & 0 deletions Sources/App/Models/Requests/RegisterRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ struct RegisterRequest: Content {
let name: String
let password: String
let confirmPassword: String
let csrf: String
}
6 changes: 6 additions & 0 deletions Tests/AppTests/Tests/Authed Tests/LoginTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,17 @@ class LoginTests: XCTestCase {
let loginRequest = LoginRequest(email: "[email protected]", password: "wrong password", csrf: "n/a")

let loginResponse = try app.sendRequest(to: "/login", method: .POST, data: loginRequest, contentType: .json)
XCTAssertEqual(loginResponse.http.status, .seeOther)
XCTAssertEqual(loginResponse.http.headers.firstValue(name: .location), "/login")
}

/// Tests that a user with valid credentials can login
func testLoginSuccessful() throws {
let _ = try User(name: "name", email: "[email protected]", password: try BCrypt.hash("password")).save(on: conn).wait()
let loginRequest = LoginRequest(email: "[email protected]", password: "password", csrf: "n/a")

let loginResponse = try app.sendRequest(to: "/login", method: .POST, data: loginRequest, contentType: .json)
XCTAssertEqual(loginResponse.http.status, .seeOther)
XCTAssertEqual(loginResponse.http.headers.firstValue(name: .location), "/home")
}
}
18 changes: 18 additions & 0 deletions Tests/AppTests/Tests/Authed Tests/RegisterTests.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import XCTest
import Foundation
import FluentMySQL
import Crypto
@testable import Vapor
@testable import App

Expand Down Expand Up @@ -30,21 +31,38 @@ class RegisterTests: XCTestCase {

/// Tests that an email cannot be registered twice
func testRegisterEmailAlreadyExists() throws {
let _ = try User(name: "name", email: "[email protected]", password: try BCrypt.hash("password")).save(on: conn).wait()
let registerRequest = RegisterRequest(email: "[email protected]", name: "name", password: "password", confirmPassword: "password", csrf: "")

let registerResponse = try app.sendRequest(to: "/register", method: .POST, data: registerRequest, contentType: .json)
XCTAssertEqual(registerResponse.http.status, .seeOther)
XCTAssertEqual(registerResponse.http.headers.firstValue(name: .location), "/register")
}

/// Tests that an invalid email cannot register
func testInvalidEmailFails() throws {
let registerRequest = RegisterRequest(email: "not an email", name: "name", password: "password", confirmPassword: "password", csrf: "")

let registerResponse = try app.sendRequest(to: "/register", method: .POST, data: registerRequest, contentType: .json)
XCTAssertEqual(registerResponse.http.status, .seeOther)
XCTAssertEqual(registerResponse.http.headers.firstValue(name: .location), "/register")
}

/// Tests that passwords must match
func testRegisterPasswordsDontMatch() throws {
let registerRequest = RegisterRequest(email: "[email protected]", name: "name", password: "password1", confirmPassword: "password2", csrf: "")

let registerResponse = try app.sendRequest(to: "/register", method: .POST, data: registerRequest, contentType: .json)
XCTAssertEqual(registerResponse.http.status, .seeOther)
XCTAssertEqual(registerResponse.http.headers.firstValue(name: .location), "/register")
}

/// Tests that users can register successfully when meeting validation requirements
func testSuccessfulRegister() throws {
let registerRequest = RegisterRequest(email: "[email protected]", name: "name", password: "password", confirmPassword: "password", csrf: "")

let registerResponse = try app.sendRequest(to: "/register", method: .POST, data: registerRequest, contentType: .json)
XCTAssertEqual(registerResponse.http.status, .seeOther)
XCTAssertEqual(registerResponse.http.headers.firstValue(name: .location), "/home")
}
}

0 comments on commit 8e773dd

Please sign in to comment.