From 640f43de1529a5135fd02b09a3132ecd1ef00d0a Mon Sep 17 00:00:00 2001
From: Oliver Wiese <oliver.wiese@fu-berlin.de>
Date: Wed, 5 Jun 2019 13:33:51 -0700
Subject: [PATCH] update onboarding testcases

---
 enzevalos_iphone/MailSession.swift            |   1 +
 .../MailServerConfigurationTest.swift         | 130 ++++++++++++++++--
 2 files changed, 120 insertions(+), 11 deletions(-)

diff --git a/enzevalos_iphone/MailSession.swift b/enzevalos_iphone/MailSession.swift
index 8a641075..4e044a39 100644
--- a/enzevalos_iphone/MailSession.swift
+++ b/enzevalos_iphone/MailSession.swift
@@ -625,6 +625,7 @@ class MailSession {
         return searchForServerConfig(hostFromAdr: hostFromAdr)
     }
     
+    
     private func searchForServerConfig(hostFromAdr: Bool) -> Bool {
         var search = false
         let (_, host) = MailSession.splitAddr(userAddr: self.mailAddr)
diff --git a/enzevalos_iphoneTests/MailServerConfigurationTest.swift b/enzevalos_iphoneTests/MailServerConfigurationTest.swift
index 306309c1..64bbf543 100644
--- a/enzevalos_iphoneTests/MailServerConfigurationTest.swift
+++ b/enzevalos_iphoneTests/MailServerConfigurationTest.swift
@@ -29,6 +29,7 @@ class MailServerConfigurationTest: XCTestCase, MailSessionListener{
     let msg11 = "2 NO [AUTHENTICATIONFAILED] Invalid credentials (Failure)\r\n"
     
     var result: Bool?
+    var expect: XCTestExpectation?
     
     override func setUp() {
         super.setUp()
@@ -81,31 +82,138 @@ class MailServerConfigurationTest: XCTestCase, MailSessionListener{
         }
     }
     
-    func testLogin(){
-        MailServerConfigurationTest.loadAccounts()
-        let session = MailSession(configSession: .IMAP, mailAddress: "ullimuelle@web.de", password: "dun3bate", username: nil)
+    /**
+     Testcase:
+     pw/name correct: find autoconfig, test input config
+     name false -> find autoconfig, test iput config
+     name correct but wrong password -> find autoconfig, test input config
+     TODO: SMTP?
+     
+     Test various accounts? Yahoo, gmx
+ */
+    
+    func testHappyPath() {
+        testJsonFile(correctPW: true, provider: "1")
+    }
+    
+    func testJsonFileButWrongPW() {
+        testJsonFile(correctPW: false, provider: "1")
+    }
+    
+    func testJsonFile(correctPW: Bool, provider: String){
+        var pw = "password"
+        let accounts = MailServerConfigurationTest.loadAccounts()
+        guard let account = accounts[provider] else {
+            XCTFail("No account for testing!")
+            return
+        }
+        if correctPW {
+            pw = account.pw
+        }
+        let session = MailSession(configSession: .IMAP, mailAddress: account.name, password: pw, username: nil)
+        session.addListener(listener: self)
+        XCTAssertEqual(account.name, session.username)
+        XCTAssertEqual(account.name, session.mailAddr)
+        XCTAssertEqual(pw, session.password)
+        expect = expectation(description: "Login result")
+        if  !session.loadFromProviderJson() {
+            XCTFail("No provider json file!")
+        }
+        if !session.startTestingServerConfig() {
+            XCTFail("No testing of config...")
+        }
+        if let expect = expect {
+            wait(for: [expect], timeout: 30)
+        }
+        if correctPW {
+            XCTAssert(result ?? false)
+        }
+        else {
+            XCTAssert(result != nil)
+            XCTAssert(!result!)
+        }
+    }
+    
+    func testNoJson() {
+        let accounts = MailServerConfigurationTest.loadAccounts()
+        guard let account = accounts["2"] else {
+            XCTFail("No account for testing!")
+            return
+        }
+        let session = MailSession(configSession: .IMAP, mailAddress: account.name, password: account.pw, username: nil)
         session.addListener(listener: self)
-        let expect = expectation(description: "OK")
-        session.startLongSearchOfServerConfig(hostFromAdr: true)
-        wait(for: [expect], timeout: 60)
+        if session.loadFromProviderJson() {
+            XCTFail("Wrong test case! Found in json file!")
+        }
+        if session.startTestingServerConfigFromList() {
+            XCTFail("Wrong test case! Json file exists.")
+        }
+        if !session.startLongSearchOfServerConfig(hostFromAdr: true) {
+            XCTFail("Could not start.")
+        }
+        expect = expectation(description: "Login result")
+        if let expect = expect {
+            wait(for: [expect], timeout: 30)
+        }
+        XCTAssert(result ?? false)
+    }
+    
+    func testDetailOnboarding() {
+        let accounts = MailServerConfigurationTest.loadAccounts()
+        guard let account = accounts["1"] else {
+            XCTFail("No account for testing!")
+            return
+        }
+        let session = MailSession(configSession: .IMAP, mailAddress: "text@example.com", password: "password", username: "user")
+        session.addListener(listener: self)
+        session.username = account.name
+        session.mailAddr = account.name
+        session.password = account.pw
+        session.setServer(hostname: "imap.web.de", port: 993, connType: MCOConnectionType.TLS.rawValue, authType: nil)
+        if !session.startTestingServerConfig() {
+            XCTFail("Could not test config.")
+        }
+        expect = expectation(description: "Login result")
+        if let expect = expect {
+            wait(for: [expect], timeout: 30)
+        }
         XCTAssert(result ?? false)
     }
     
     func testFinish(result: Bool) {
+        guard let expect = expect else {
+            XCTFail("No expectation!")
+            return
+        }
         self.result = result
+        expect.fulfill()
     }
     
-    static func loadAccounts() -> [(name: String, pw: String)] {
+    private static func loadAccounts() -> [String:(name: String, pw: String)] {
         let bundle = Bundle(for: self)
+        var newAccounts = [String:(name: String, pw: String)]()
         guard let url = bundle.url(forResource: "accounts", withExtension: "json"), let data = try? Data(contentsOf: url),  let jsonDic = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves)  else {
-            
             XCTFail()
-            return []
+            return [:]
         }
-        print(jsonDic)
-        return []
+        if let dic = jsonDic as? Dictionary<String, Any>{
+            if let accounts = dic["accounts"], let array = accounts as? Array<Any> {
+                for elem in array {
+                    if let account = elem as? Dictionary<String, String> {
+                        if let id = account["id"], let username = account["username"] , let pw = account["password"] {
+                            newAccounts[id] = (username, pw)
+                        }
+                    }
+                }
+            }
+           
+        }
+        return newAccounts
     }
     
+    private static func extractProvider(adr: String) -> String? {
+        return adr.components(separatedBy: "@").last
+    }
     
     
 }
-- 
GitLab