/**
  * @dataProvider provideHeaderHasPrecedence
  */
 public function testHeaderHasPrecedence($server, $get, $expected)
 {
     $settings = new RuntimeSettings($server, $get);
     $this->assertSame($expected, $settings->getValue('Foo'));
 }
 /**
  * @param Container $app
  */
 public function register(Container $app)
 {
     $runtime = new RuntimeSettings($_SERVER, $_GET);
     if (!isset($app['config.is_dev'])) {
         $app['config.is_dev'] = $runtime->isDev();
     }
     if (!isset($app['config.environment'])) {
         $app['config.environment'] = $runtime->getEnv();
     }
     $app['config.is_tenant_based'] = function (Container $app) {
         return !empty($app['config.tenant_based']);
     };
     $app['config.is_tenant_required'] = function (Container $app) {
         return !empty($app['config.require_tenant']) || $app['config.is_tenant_based'];
     };
     if (!isset($app['config.tenant'])) {
         $app['config.tenant'] = function (Container $app) use($runtime) {
             $tenant = $runtime->getTenant();
             if (!$app['config.is_tenant_based'] && empty($tenant)) {
                 $tenant = $app['config']->get('tenant');
             }
             if ($app['config.is_tenant_required'] && empty($tenant)) {
                 throw new ConfigurationException('Tenant header or environment setting must be provided.');
             }
             return $tenant;
         };
     }
     if (!isset($app['config.validator.constraints'])) {
         $app['config.validator.constraints'] = null;
     }
     if (!isset($app['config.validator'])) {
         $app['config.validator'] = null;
     }
     $app['config.helper'] = function (Container $app) {
         return new ConfigurationHelper($app);
     };
     $app['config.common'] = function ($app) {
         try {
             return ConfigurationFactory::init($app['config.driver'], ConfigurationFactory::ENV_COMMON, [])->getSettings();
         } catch (Exception $e) {
             // This means that the common file doesn't exist. Not a problem.
             return [];
         }
     };
     $app['config.factory'] = function ($app) {
         /** @var ConfigurationHelper $helper */
         $helper = $app['config.helper'];
         return new ConfigurationFactory($helper->getDriver(), $helper->getValidator());
     };
     $app['config.factory.tenant'] = function (Container $app) {
         /** @var ConfigurationHelper $helper */
         $helper = $app['config.helper'];
         return new TenantBasedConfigurationFactory($helper->getDriver(), $helper->getValidator(), $app['config.tenant']);
     };
     $app['config'] = function (Container $app) {
         /** @var ConfigurationHelper $helper */
         $helper = $app['config.helper'];
         /** @var ConfigurationFactory $factory */
         $factory = $app['config.is_tenant_based'] ? $app['config.factory.tenant'] : $app['config.factory'];
         return $factory->load($helper->getEnvironment(), $helper->getCommon(), $helper->getValidationConstraints());
     };
 }