From 1477621c7ae200fae25e6638e0df0192f9e3b668 Mon Sep 17 00:00:00 2001
From: Andrew Hoffmann <andrew.hoffmann@wisc.edu>
Date: Tue, 6 Dec 2016 10:51:08 -0600
Subject: [PATCH] Create missing tests for PreauthUserDetailsProvider

Introduce a `trait` that helps set environment variables when testing
---
 .../wisc/doit/uwphps/EnvironmentHelper.php    | 44 ++++++++++
 .../PreauthUserDetailsProviderTest.php        | 85 +++++++++++++++++++
 2 files changed, 129 insertions(+)
 create mode 100644 src/test/edu/wisc/doit/uwphps/EnvironmentHelper.php
 create mode 100644 src/test/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProviderTest.php

diff --git a/src/test/edu/wisc/doit/uwphps/EnvironmentHelper.php b/src/test/edu/wisc/doit/uwphps/EnvironmentHelper.php
new file mode 100644
index 0000000..30cbb1a
--- /dev/null
+++ b/src/test/edu/wisc/doit/uwphps/EnvironmentHelper.php
@@ -0,0 +1,44 @@
+<?php
+namespace edu\wisc\doit\uwphps;
+
+trait EnvironmentHelper
+{
+
+    /**
+     * Sets environment variables
+     *
+     * @param array $environment  pairs of environment variable names and values
+     */
+    private function setEnvironment(array $environment)
+    {
+        array_walk($environment, function ($value, $key) {
+            putenv("$key=$value");
+        });
+    }
+
+    /**
+     * Removes the given environment variable from the environment
+     *
+     * @param string $variable  name of environment variable
+     */
+    private function removeEnvironmentVariable($variable)
+    {
+        putenv($variable);
+    }
+
+    /**
+     * Converts environment variable names to their HTTP header equivalents
+     *
+     * @param array $environment
+     * @return array  environment with variable names converted to HTTP headers
+     * @see UserDetailsProvider::httpHeaderFromAttribute()
+     */
+    private function toHttpHeaders(array $environment)
+    {
+        foreach ($environment as $key => $value) {
+            $environment[UserDetailsProvider::httpHeaderFromAttribute($key)] = $value;
+            unset($environment[$key]);
+        }
+        return $environment;
+    }
+}
diff --git a/src/test/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProviderTest.php b/src/test/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProviderTest.php
new file mode 100644
index 0000000..138d9a9
--- /dev/null
+++ b/src/test/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProviderTest.php
@@ -0,0 +1,85 @@
+<?php
+namespace edu\wisc\doit\uwphps\preauth;
+
+use edu\wisc\doit\uwphps\EnvironmentHelper;
+use edu\wisc\doit\uwphps\UserDetailsProvider;
+
+/**
+ * Tests for {@link PreauthUserDetailsProvider}
+ */
+class PreauthUserDetailsProviderTest extends \PHPUnit_Framework_TestCase
+{
+
+    use EnvironmentHelper;
+
+    /** @var PreauthUserDetailsProvider */
+    private $provider;
+
+    /** @var PreauthUserDetailsProvider */
+    private $providerWithHttp;
+
+    /** @var array  environment variables to be set */
+    private $environment;
+
+    protected function setUp()
+    {
+        $this->provider = new PreauthUserDetailsProvider(false);
+        $this->providerWithHttp = new PreauthUserDetailsProvider(true);
+
+        // Default environment variables
+        $this->environment = [
+            PreauthUserDetailsProvider::FULL_NAME => 'BUCKINGHAM BADGER',
+            PreauthUserDetailsProvider::EPPN => 'bbadger@wisc.edu',
+            PreauthUserDetailsProvider::FIRST_NAME => 'BUCKINGHAM',
+            PreauthUserDetailsProvider::EMAIL => 'bucky.badger@wisc.edu',
+            PreauthUserDetailsProvider::SHIB_SESSION_ID => '1234567890',
+            PreauthUserDetailsProvider::LAST_NAME => 'BADGER',
+            PreauthUserDetailsProvider::SOURCE => 'a_source',
+            PreauthUserDetailsProvider::PVI => 'UW123A456',
+            PreauthUserDetailsProvider::ISIS_EMPLID => '123456789'
+        ];
+    }
+
+    /** @test */
+    public function loadsNullUserWhenNoSession()
+    {
+        // Ensure the Shib Session ID environment variables are deleted
+        $this->removeEnvironmentVariable(UserDetailsProvider::SHIB_SESSION_ID);
+        $this->removeEnvironmentVariable(UserDetailsProvider::SHIB_SESSION_ID_HTTP);
+        static::assertNull($this->provider->loadUser());
+        static::assertNull($this->providerWithHttp->loadUser());
+    }
+
+    /** @test */
+    public function loadsUser()
+    {
+        $this->setEnvironment($this->environment);
+
+        $user = $this->provider->loadUser();
+
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::EPPN], $user->getEppn());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::PVI], $user->getPvi());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::FULL_NAME], $user->getFullName());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::EMAIL], $user->getEmailAddress());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::SOURCE], $user->getSource());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::ISIS_EMPLID], $user->getIsisEmplid());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::FIRST_NAME], $user->getFirstName());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::LAST_NAME], $user->getLastName());
+    }
+
+    /** @test */
+    public function loadsUserWithHttpHeaders()
+    {
+        $this->setEnvironment($this->toHttpHeaders($this->environment));
+        $user = $this->providerWithHttp->loadUser();
+
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::EPPN], $user->getEppn());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::PVI], $user->getPvi());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::FULL_NAME], $user->getFullName());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::EMAIL], $user->getEmailAddress());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::SOURCE], $user->getSource());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::ISIS_EMPLID], $user->getIsisEmplid());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::FIRST_NAME], $user->getFirstName());
+        $this->assertEquals($this->environment[PreauthUserDetailsProvider::LAST_NAME], $user->getLastName());
+    }
+}
-- 
GitLab