RepositoryTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <?php
  2. namespace Dotenv\Tests;
  3. use Dotenv\Dotenv;
  4. use Dotenv\Repository\Adapter\ArrayAdapter;
  5. use Dotenv\Repository\RepositoryBuilder;
  6. use PHPUnit\Framework\TestCase;
  7. class RepositoryTest extends TestCase
  8. {
  9. /**
  10. * @var string
  11. */
  12. private $folder;
  13. /**
  14. * @var string[]|null
  15. */
  16. protected $keyVal;
  17. /**
  18. * @before
  19. */
  20. public function setUpTest()
  21. {
  22. $this->folder = dirname(__DIR__).'/fixtures/env';
  23. $this->keyVal(true);
  24. }
  25. protected function load()
  26. {
  27. $dotenv = Dotenv::createImmutable($this->folder);
  28. $dotenv->load();
  29. }
  30. /**
  31. * Generates a new key/value pair or returns the previous one.
  32. *
  33. * Since most of our functionality revolves around setting/retrieving keys
  34. * and values, we have this utility function to help generate new, unique
  35. * key/value pairs.
  36. *
  37. * @param bool $reset
  38. *
  39. * @return array
  40. */
  41. protected function keyVal($reset = false)
  42. {
  43. if (!isset($this->keyVal) || $reset) {
  44. $this->keyVal = [uniqid() => uniqid()];
  45. }
  46. return $this->keyVal;
  47. }
  48. /**
  49. * Returns the key from keyVal(), without reset.
  50. *
  51. * @return string
  52. */
  53. protected function key()
  54. {
  55. $keyVal = $this->keyVal();
  56. return key($keyVal);
  57. }
  58. /**
  59. * Returns the value from keyVal(), without reset.
  60. *
  61. * @return string
  62. */
  63. protected function value()
  64. {
  65. $keyVal = $this->keyVal();
  66. return reset($keyVal);
  67. }
  68. public function testMutableLoaderClearsEnvironmentVars()
  69. {
  70. $repository = RepositoryBuilder::create()->make();
  71. // Set an environment variable.
  72. $repository->set($this->key(), $this->value());
  73. // Clear the set environment variable.
  74. $repository->clear($this->key());
  75. self::assertSame(null, $repository->get($this->key()));
  76. self::assertSame(false, getenv($this->key()));
  77. self::assertSame(false, isset($_ENV[$this->key()]));
  78. self::assertSame(false, isset($_SERVER[$this->key()]));
  79. }
  80. public function testImmutableLoaderCannotClearEnvironmentVars()
  81. {
  82. $this->load();
  83. $repository = RepositoryBuilder::create()->immutable()->make();
  84. // Set an environment variable.
  85. $repository->set($this->key(), $this->value());
  86. // Attempt to clear the environment variable, check that it fails.
  87. $repository->clear($this->key());
  88. self::assertSame($this->value(), $repository->get($this->key()));
  89. self::assertSame($this->value(), getenv($this->key()));
  90. self::assertSame(true, isset($_ENV[$this->key()]));
  91. self::assertSame(true, isset($_SERVER[$this->key()]));
  92. }
  93. public function testCheckingWhetherVariableExists()
  94. {
  95. $this->load();
  96. $repo = RepositoryBuilder::create()->make();
  97. self::assertTrue($repo->has('FOO'));
  98. self::assertFalse($repo->has('NON_EXISTING_VARIABLE'));
  99. }
  100. public function testCheckingHasWithBadType()
  101. {
  102. $this->load();
  103. $repo = RepositoryBuilder::create()->make();
  104. self::assertFalse($repo->has(123));
  105. self::assertFalse($repo->has(null));
  106. }
  107. public function testGettingVariableByName()
  108. {
  109. $this->load();
  110. $repo = RepositoryBuilder::create()->make();
  111. self::assertSame('bar', $repo->get('FOO'));
  112. }
  113. /**
  114. * @expectedException \InvalidArgumentException
  115. * @expectedExceptionMessage Expected name to be a non-empty string.
  116. */
  117. public function testGettingNullVariable()
  118. {
  119. $repo = RepositoryBuilder::create()->make();
  120. $repo->get(null);
  121. }
  122. /**
  123. * @expectedException \InvalidArgumentException
  124. * @expectedExceptionMessage Expected name to be a non-empty string.
  125. */
  126. public function testGettingEmptyVariable()
  127. {
  128. $repo = RepositoryBuilder::create()->make();
  129. $repo->get('');
  130. }
  131. public function testSettingVariable()
  132. {
  133. $this->load();
  134. $repo = RepositoryBuilder::create()->make();
  135. self::assertSame('bar', $repo->get('FOO'));
  136. $repo->set('FOO', 'new');
  137. self::assertSame('new', $repo->get('FOO'));
  138. }
  139. /**
  140. * @expectedException \InvalidArgumentException
  141. * @expectedExceptionMessage Expected name to be a non-empty string.
  142. */
  143. public function testSettingNullVariable()
  144. {
  145. $repo = RepositoryBuilder::create()->make();
  146. $repo->set(null, 'foo');
  147. }
  148. /**
  149. * @expectedException \InvalidArgumentException
  150. * @expectedExceptionMessage Expected name to be a non-empty string.
  151. */
  152. public function testSettingEmptyVariable()
  153. {
  154. $repo = RepositoryBuilder::create()->make();
  155. $repo->set('', 'foo');
  156. }
  157. public function testClearingVariable()
  158. {
  159. $this->load();
  160. $repo = RepositoryBuilder::create()->make();
  161. self::assertTrue($repo->has('FOO'));
  162. $repo->clear('FOO');
  163. self::assertFalse($repo->has('FOO'));
  164. }
  165. public function testClearingVariableWithArrayAdapter()
  166. {
  167. $adapters = [new ArrayAdapter()];
  168. $repo = RepositoryBuilder::create()->withReaders($adapters)->withWriters($adapters)->make();
  169. self::assertFalse($repo->has('FOO'));
  170. $repo->set('FOO', 'BAR');
  171. self::assertTrue($repo->has('FOO'));
  172. $repo->clear('FOO');
  173. self::assertFalse($repo->has('FOO'));
  174. }
  175. /**
  176. * @expectedException \InvalidArgumentException
  177. * @expectedExceptionMessage Expected name to be a non-empty string.
  178. */
  179. public function testClearingNullVariable()
  180. {
  181. $repo = RepositoryBuilder::create()->make();
  182. $repo->clear(null);
  183. }
  184. /**
  185. * @expectedException \InvalidArgumentException
  186. * @expectedExceptionMessage Expected name to be a non-empty string.
  187. */
  188. public function testClearingEmptyVariable()
  189. {
  190. $repo = RepositoryBuilder::create()->make();
  191. $repo->clear('');
  192. }
  193. public function testCannotSetVariableOnImmutableInstance()
  194. {
  195. $this->load();
  196. $repo = RepositoryBuilder::create()->immutable()->make();
  197. self::assertSame('bar', $repo->get('FOO'));
  198. $repo->set('FOO', 'new');
  199. self::assertSame('bar', $repo->get('FOO'));
  200. }
  201. public function testCannotClearVariableOnImmutableInstance()
  202. {
  203. $this->load();
  204. $repo = RepositoryBuilder::create()->immutable()->make();
  205. $repo->clear('FOO');
  206. self::assertTrue($repo->has('FOO'));
  207. }
  208. public function testCheckingWhetherVariableExistsUsingArrayNotation()
  209. {
  210. $this->load();
  211. $repo = RepositoryBuilder::create()->make();
  212. self::assertTrue(isset($repo['FOO']));
  213. self::assertFalse(isset($repo['NON_EXISTING_VARIABLE']));
  214. }
  215. public function testGettingVariableByNameUsingArrayNotation()
  216. {
  217. $this->load();
  218. $repo = RepositoryBuilder::create()->make();
  219. self::assertSame('bar', $repo['FOO']);
  220. }
  221. public function testSettingVariableUsingArrayNotation()
  222. {
  223. $this->load();
  224. $repo = RepositoryBuilder::create()->make();
  225. self::assertSame('bar', $repo['FOO']);
  226. $repo['FOO'] = 'new';
  227. self::assertSame('new', $repo['FOO']);
  228. }
  229. public function testClearingVariableUsingArrayNotation()
  230. {
  231. $this->load();
  232. $repo = RepositoryBuilder::create()->make();
  233. unset($repo['FOO']);
  234. self::assertFalse(isset($repo['FOO']));
  235. }
  236. }