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 0000000000000000000000000000000000000000..30cbb1a7df0adde7cd058b41637e6e0a8cc34452
--- /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 0000000000000000000000000000000000000000..138d9a9f4dddd1e1488dae4459b32eeb7a988b77
--- /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());
+    }
+}