From 9b8f126d36b16b1ddcf168d2be35ed32545be5e7 Mon Sep 17 00:00:00 2001 From: Daniel Saidi Date: Thu, 11 Jun 2020 15:52:55 +0200 Subject: [PATCH] Add e-mail validator --- .../SwiftKit/Validation/EmailValidator.swift | 20 ++++++++ Sources/SwiftKit/Validation/Validator.swift | 16 ++++++ .../Operations/PerformAsyncTests.swift | 19 ------- .../Validation/EmailValidatorTests.swift | 51 +++++++++++++++++++ 4 files changed, 87 insertions(+), 19 deletions(-) create mode 100644 Sources/SwiftKit/Validation/EmailValidator.swift create mode 100644 Sources/SwiftKit/Validation/Validator.swift delete mode 100644 Tests/SwiftKitTests/Operations/PerformAsyncTests.swift create mode 100644 Tests/SwiftKitTests/Validation/EmailValidatorTests.swift diff --git a/Sources/SwiftKit/Validation/EmailValidator.swift b/Sources/SwiftKit/Validation/EmailValidator.swift new file mode 100644 index 0000000..4de5fce --- /dev/null +++ b/Sources/SwiftKit/Validation/EmailValidator.swift @@ -0,0 +1,20 @@ +// +// EmailValidator.swift +// SwiftKit +// +// Created by Daniel Saidi on 2020-06-09. +// Copyright © 2020 Daniel Saidi. All rights reserved. +// + +import Foundation + +public class EmailValidator: Validator { + + public init() {} + + public func validate(_ string: String) -> Bool { + let regExp = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,} ?" + let predicate = NSPredicate(format: "SELF MATCHES %@", regExp) + return predicate.evaluate(with: string) + } +} diff --git a/Sources/SwiftKit/Validation/Validator.swift b/Sources/SwiftKit/Validation/Validator.swift new file mode 100644 index 0000000..02e2632 --- /dev/null +++ b/Sources/SwiftKit/Validation/Validator.swift @@ -0,0 +1,16 @@ +// +// Validator.swift +// SwiftKit +// +// Created by Daniel Saidi on 2020-06-09. +// Copyright © 2020 Daniel Saidi. All rights reserved. +// + +import Foundation + +public protocol Validator { + + associatedtype Validation + + func validate(_ obj: Validation) -> Bool +} diff --git a/Tests/SwiftKitTests/Operations/PerformAsyncTests.swift b/Tests/SwiftKitTests/Operations/PerformAsyncTests.swift deleted file mode 100644 index 75277ee..0000000 --- a/Tests/SwiftKitTests/Operations/PerformAsyncTests.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// PerformAsyncTests.swift -// SwiftKitTests -// -// Created by Daniel Saidi on 2020-06-01. -// Copyright © 2020 Daniel Saidi. All rights reserved. -// - -import Quick -import Nimble -import SwiftKit - -class PerformTests: QuickSpec { - - override func spec() { - - - } -} diff --git a/Tests/SwiftKitTests/Validation/EmailValidatorTests.swift b/Tests/SwiftKitTests/Validation/EmailValidatorTests.swift new file mode 100644 index 0000000..89a826d --- /dev/null +++ b/Tests/SwiftKitTests/Validation/EmailValidatorTests.swift @@ -0,0 +1,51 @@ +// +// PerformAsyncTests.swift +// SwiftKitTests +// +// Created by Daniel Saidi on 2020-06-09. +// Copyright © 2020 Daniel Saidi. All rights reserved. +// + +import Quick +import Nimble +import SwiftKit + +class EmailValidatorTests: QuickSpec { + + override func spec() { + + describe("email validator") { + + let validate = EmailValidator().validate + + context("when validating validating valid addresses") { + + it("validates valid email addresses") { + expect(validate("foobar@baz.com")).to(beTrue()) + expect(validate("foo1.bar2@baz.com")).to(beTrue()) + expect(validate("foo.bar@gmail.com")).to(beTrue()) + } + + it("validates long top domains") { + expect(validate("foobar@baz.co")).to(beTrue()) + expect(validate("foobar@baz.com")).to(beTrue()) + expect(validate("foo1.bar2@baz.comm")).to(beTrue()) + expect(validate("foo.bar@gmail.commmmmmmmmmmmmmmm")).to(beTrue()) + } + } + + context("when validating invalid addresses") { + + it("does not validate invalid email addresses") { + expect(validate("foobar")).to(beFalse()) + expect(validate("foo1.bar2@")).to(beFalse()) + expect(validate("foo.bar@gmail")).to(beFalse()) + } + + it("does not validate too short top domains") { + expect(validate("foobar@baz.c")).to(beFalse()) + } + } + } + } +}