ValidatorTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. <?php
  2. use Dotenv\Dotenv;
  3. use PHPUnit\Framework\TestCase;
  4. class ValidatorTest extends TestCase
  5. {
  6. /**
  7. * @var string
  8. */
  9. private $fixturesFolder;
  10. public function setUp()
  11. {
  12. $this->fixturesFolder = dirname(__DIR__).'/fixtures/env';
  13. }
  14. public function testDotenvRequiredStringEnvironmentVars()
  15. {
  16. $dotenv = Dotenv::create($this->fixturesFolder);
  17. $dotenv->load();
  18. $dotenv->required('FOO');
  19. $this->assertTrue(true);
  20. }
  21. public function testDotenvAllowedValues()
  22. {
  23. $dotenv = Dotenv::create($this->fixturesFolder);
  24. $dotenv->load();
  25. $dotenv->required('FOO')->allowedValues(['bar', 'baz']);
  26. $this->assertTrue(true);
  27. }
  28. public function testDotenvAllowedValuesIfPresent()
  29. {
  30. $dotenv = Dotenv::create($this->fixturesFolder);
  31. $dotenv->load();
  32. $dotenv->ifPresent('FOO')->allowedValues(['bar', 'baz']);
  33. $this->assertTrue(true);
  34. }
  35. /**
  36. * @expectedException \Dotenv\Exception\ValidationException
  37. * @expectedExceptionMessage One or more environment variables failed assertions: FOO is not one of [buzz, buz].
  38. */
  39. public function testDotenvProhibitedValues()
  40. {
  41. $dotenv = Dotenv::create($this->fixturesFolder);
  42. $dotenv->load();
  43. $dotenv->required('FOO')->allowedValues(['buzz', 'buz']);
  44. }
  45. /**
  46. * @expectedException \Dotenv\Exception\ValidationException
  47. * @expectedExceptionMessage One or more environment variables failed assertions: FOO is not one of [buzz, buz].
  48. */
  49. public function testDotenvProhibitedValuesIfPresent()
  50. {
  51. $dotenv = Dotenv::create($this->fixturesFolder);
  52. $dotenv->load();
  53. $dotenv->ifPresent('FOO')->allowedValues(['buzz', 'buz']);
  54. }
  55. /**
  56. * @expectedException \Dotenv\Exception\ValidationException
  57. * @expectedExceptionMessage One or more environment variables failed assertions: FOOX is missing, NOPE is missing.
  58. */
  59. public function testDotenvRequiredThrowsRuntimeException()
  60. {
  61. $dotenv = Dotenv::create($this->fixturesFolder);
  62. $dotenv->load();
  63. $this->assertFalse(getenv('FOOX'));
  64. $this->assertFalse(getenv('NOPE'));
  65. $dotenv->required(['FOOX', 'NOPE']);
  66. }
  67. public function testDotenvRequiredArrayEnvironmentVars()
  68. {
  69. $dotenv = Dotenv::create($this->fixturesFolder);
  70. $dotenv->load();
  71. $dotenv->required(['FOO', 'BAR']);
  72. $this->assertTrue(true);
  73. }
  74. public function testDotenvAssertions()
  75. {
  76. $dotenv = Dotenv::create($this->fixturesFolder, 'assertions.env');
  77. $dotenv->load();
  78. $this->assertSame('val1', getenv('ASSERTVAR1'));
  79. $this->assertEmpty(getenv('ASSERTVAR2'));
  80. $this->assertSame('val3 ', getenv('ASSERTVAR3'));
  81. $this->assertSame('0', getenv('ASSERTVAR4'));
  82. $this->assertSame('#foo', getenv('ASSERTVAR5'));
  83. $this->assertSame("val1\nval2", getenv('ASSERTVAR6'));
  84. $this->assertSame("\nval3", getenv('ASSERTVAR7'));
  85. $this->assertSame("val3\n", getenv('ASSERTVAR8'));
  86. $dotenv->required([
  87. 'ASSERTVAR1',
  88. 'ASSERTVAR2',
  89. 'ASSERTVAR3',
  90. 'ASSERTVAR4',
  91. 'ASSERTVAR5',
  92. 'ASSERTVAR6',
  93. 'ASSERTVAR7',
  94. 'ASSERTVAR8',
  95. 'ASSERTVAR9',
  96. ]);
  97. $dotenv->required([
  98. 'ASSERTVAR1',
  99. 'ASSERTVAR3',
  100. 'ASSERTVAR4',
  101. 'ASSERTVAR5',
  102. 'ASSERTVAR6',
  103. 'ASSERTVAR7',
  104. 'ASSERTVAR8',
  105. ])->notEmpty();
  106. $dotenv->required([
  107. 'ASSERTVAR1',
  108. 'ASSERTVAR4',
  109. 'ASSERTVAR5',
  110. ])->notEmpty()->allowedValues(['0', 'val1', '#foo']);
  111. }
  112. /**
  113. * @expectedException \Dotenv\Exception\ValidationException
  114. * @expectedExceptionMessage One or more environment variables failed assertions: ASSERTVAR2 is empty.
  115. */
  116. public function testDotenvEmptyThrowsRuntimeException()
  117. {
  118. $dotenv = Dotenv::create($this->fixturesFolder, 'assertions.env');
  119. $dotenv->load();
  120. $this->assertEmpty(getenv('ASSERTVAR2'));
  121. $dotenv->required('ASSERTVAR2')->notEmpty();
  122. }
  123. public function testDotenvEmptyWhenNotPresent()
  124. {
  125. $dotenv = Dotenv::create($this->fixturesFolder, 'assertions.env');
  126. $dotenv->load();
  127. $dotenv->ifPresent('ASSERTVAR2_NO_SUCH_VARIABLE')->notEmpty();
  128. $this->assertTrue(true);
  129. }
  130. /**
  131. * @expectedException \Dotenv\Exception\ValidationException
  132. * @expectedExceptionMessage One or more environment variables failed assertions: ASSERTVAR9 is empty.
  133. */
  134. public function testDotenvStringOfSpacesConsideredEmpty()
  135. {
  136. $dotenv = Dotenv::create($this->fixturesFolder, 'assertions.env');
  137. $dotenv->load();
  138. $dotenv->required('ASSERTVAR9')->notEmpty();
  139. }
  140. /**
  141. * @expectedException \Dotenv\Exception\ValidationException
  142. * @expectedExceptionMessage One or more environment variables failed assertions: foo is missing.
  143. */
  144. public function testDotenvValidateRequiredWithoutLoading()
  145. {
  146. $dotenv = Dotenv::create($this->fixturesFolder, 'assertions.env');
  147. $dotenv->required('foo');
  148. }
  149. public function testDotenvRequiredCanBeUsedWithoutLoadingFile()
  150. {
  151. putenv('REQUIRED_VAR=1');
  152. $dotenv = Dotenv::create($this->fixturesFolder);
  153. $dotenv->required('REQUIRED_VAR')->notEmpty();
  154. $this->assertTrue(true);
  155. }
  156. /**
  157. * List of valid boolean values in fixtures/env/booleans.env.
  158. *
  159. * @return array
  160. */
  161. public function validBooleanValuesDataProvider()
  162. {
  163. return [
  164. ['VALID_EXPLICIT_LOWERCASE_TRUE'],
  165. ['VALID_EXPLICIT_LOWERCASE_FALSE'],
  166. ['VALID_EXPLICIT_UPPERCASE_TRUE'],
  167. ['VALID_EXPLICIT_UPPERCASE_FALSE'],
  168. ['VALID_EXPLICIT_MIXEDCASE_TRUE'],
  169. ['VALID_EXPLICIT_MIXEDCASE_FALSE'],
  170. ['VALID_NUMBER_TRUE'],
  171. ['VALID_NUMBER_FALSE'],
  172. ['VALID_ONOFF_LOWERCASE_TRUE'],
  173. ['VALID_ONOFF_LOWERCASE_FALSE'],
  174. ['VALID_ONOFF_UPPERCASE_TRUE'],
  175. ['VALID_ONOFF_UPPERCASE_FALSE'],
  176. ['VALID_ONOFF_MIXEDCASE_TRUE'],
  177. ['VALID_ONOFF_MIXEDCASE_FALSE'],
  178. ['VALID_YESNO_LOWERCASE_TRUE'],
  179. ['VALID_YESNO_LOWERCASE_FALSE'],
  180. ['VALID_YESNO_UPPERCASE_TRUE'],
  181. ['VALID_YESNO_UPPERCASE_FALSE'],
  182. ['VALID_YESNO_MIXEDCASE_TRUE'],
  183. ['VALID_YESNO_MIXEDCASE_FALSE'],
  184. ];
  185. }
  186. /**
  187. * @dataProvider validBooleanValuesDataProvider
  188. */
  189. public function testCanValidateBooleans($boolean)
  190. {
  191. $dotenv = Dotenv::create($this->fixturesFolder, 'booleans.env');
  192. $dotenv->load();
  193. $dotenv->required($boolean)->isBoolean();
  194. $this->assertTrue(true);
  195. }
  196. /**
  197. * @dataProvider validBooleanValuesDataProvider
  198. */
  199. public function testCanValidateBooleansIfPresent($boolean)
  200. {
  201. $dotenv = Dotenv::create($this->fixturesFolder, 'booleans.env');
  202. $dotenv->load();
  203. $dotenv->ifPresent($boolean)->isBoolean();
  204. $this->assertTrue(true);
  205. }
  206. /**
  207. * List of non-boolean values in fixtures/env/booleans.env.
  208. *
  209. * @return array
  210. */
  211. public function invalidBooleanValuesDataProvider()
  212. {
  213. return [
  214. ['INVALID_SOMETHING'],
  215. ['INVALID_EMPTY'],
  216. ['INVALID_EMPTY_STRING'],
  217. ['INVALID_NULL'],
  218. ['INVALID_NUMBER_POSITIVE'],
  219. ['INVALID_NUMBER_NEGATIVE'],
  220. ['INVALID_MINUS'],
  221. ['INVALID_TILDA'],
  222. ['INVALID_EXCLAMATION'],
  223. ];
  224. }
  225. /**
  226. * @dataProvider invalidBooleanValuesDataProvider
  227. * @expectedException \Dotenv\Exception\ValidationException
  228. * @expectedExceptionMessage One or more environment variables failed assertions: INVALID_
  229. */
  230. public function testCanInvalidateNonBooleans($boolean)
  231. {
  232. $dotenv = Dotenv::create($this->fixturesFolder, 'booleans.env');
  233. $dotenv->load();
  234. $dotenv->required($boolean)->isBoolean();
  235. }
  236. /**
  237. * @dataProvider invalidBooleanValuesDataProvider
  238. * @expectedException \Dotenv\Exception\ValidationException
  239. * @expectedExceptionMessage One or more environment variables failed assertions: INVALID_
  240. */
  241. public function testCanInvalidateNonBooleansIfPresent($boolean)
  242. {
  243. $dotenv = Dotenv::create($this->fixturesFolder, 'booleans.env');
  244. $dotenv->load();
  245. $dotenv->ifPresent($boolean)->isBoolean();
  246. }
  247. /**
  248. * @expectedException \Dotenv\Exception\ValidationException
  249. * @expectedExceptionMessage One or more environment variables failed assertions: VAR_DOES_NOT_EXIST_234782462764
  250. */
  251. public function testCanInvalidateBooleanNonExist()
  252. {
  253. $dotenv = Dotenv::create($this->fixturesFolder, 'booleans.env');
  254. $dotenv->load();
  255. $dotenv->required(['VAR_DOES_NOT_EXIST_234782462764'])->isBoolean();
  256. }
  257. public function testIfPresentBooleanNonExist()
  258. {
  259. $dotenv = Dotenv::create($this->fixturesFolder, 'booleans.env');
  260. $dotenv->load();
  261. $dotenv->ifPresent(['VAR_DOES_NOT_EXIST_234782462764'])->isBoolean();
  262. $this->assertTrue(true);
  263. }
  264. /**
  265. * List of valid integer values in fixtures/env/integers.env.
  266. *
  267. * @return array
  268. */
  269. public function validIntegerValuesDataProvider()
  270. {
  271. return [
  272. ['VALID_ZERO'],
  273. ['VALID_ONE'],
  274. ['VALID_TWO'],
  275. ['VALID_LARGE'],
  276. ['VALID_HUGE'],
  277. ];
  278. }
  279. /**
  280. * @dataProvider validIntegerValuesDataProvider
  281. */
  282. public function testCanValidateIntegers($integer)
  283. {
  284. $dotenv = Dotenv::create($this->fixturesFolder, 'integers.env');
  285. $dotenv->load();
  286. $dotenv->required($integer)->isInteger();
  287. $this->assertTrue(true);
  288. }
  289. /**
  290. * @dataProvider validIntegerValuesDataProvider
  291. */
  292. public function testCanValidateIntegersIfPresent($integer)
  293. {
  294. $dotenv = Dotenv::create($this->fixturesFolder, 'integers.env');
  295. $dotenv->load();
  296. $dotenv->ifPresent($integer)->isInteger();
  297. $this->assertTrue(true);
  298. }
  299. /**
  300. * List of non-integer values in fixtures/env/integers.env.
  301. *
  302. * @return array
  303. */
  304. public function invalidIntegerValuesDataProvider()
  305. {
  306. return [
  307. ['INVALID_SOMETHING'],
  308. ['INVALID_EMPTY'],
  309. ['INVALID_EMPTY_STRING'],
  310. ['INVALID_NULL'],
  311. ['INVALID_NEGATIVE'],
  312. ['INVALID_MINUS'],
  313. ['INVALID_TILDA'],
  314. ['INVALID_EXCLAMATION'],
  315. ['INVALID_SPACES'],
  316. ['INVALID_COMMAS'],
  317. ];
  318. }
  319. /**
  320. * @dataProvider invalidIntegerValuesDataProvider
  321. * @expectedException \Dotenv\Exception\ValidationException
  322. * @expectedExceptionMessage One or more environment variables failed assertions: INVALID_
  323. */
  324. public function testCanInvalidateNonIntegers($integer)
  325. {
  326. $dotenv = Dotenv::create($this->fixturesFolder, 'integers.env');
  327. $dotenv->load();
  328. $dotenv->required($integer)->isInteger();
  329. }
  330. /**
  331. * @dataProvider invalidIntegerValuesDataProvider
  332. * @expectedException \Dotenv\Exception\ValidationException
  333. * @expectedExceptionMessage One or more environment variables failed assertions: INVALID_
  334. */
  335. public function testCanInvalidateNonIntegersIfExist($integer)
  336. {
  337. $dotenv = Dotenv::create($this->fixturesFolder, 'integers.env');
  338. $dotenv->load();
  339. $dotenv->ifPresent($integer)->isInteger();
  340. }
  341. /**
  342. * @expectedException \Dotenv\Exception\ValidationException
  343. * @expectedExceptionMessage One or more environment variables failed assertions: VAR_DOES_NOT_EXIST_234782462764
  344. */
  345. public function testCanInvalidateIntegerNonExist()
  346. {
  347. $dotenv = Dotenv::create($this->fixturesFolder, 'integers.env');
  348. $dotenv->load();
  349. $dotenv->required(['VAR_DOES_NOT_EXIST_234782462764'])->isInteger();
  350. }
  351. public function testIfPresentIntegerNonExist()
  352. {
  353. $dotenv = Dotenv::create($this->fixturesFolder, 'integers.env');
  354. $dotenv->load();
  355. $dotenv->ifPresent(['VAR_DOES_NOT_EXIST_234782462764'])->isInteger();
  356. $this->assertTrue(true);
  357. }
  358. public function testDotenvRegexMatchPass()
  359. {
  360. $dotenv = Dotenv::create($this->fixturesFolder);
  361. $dotenv->load();
  362. $dotenv->required('FOO')->allowedRegexValues('([[:lower:]]{3})');
  363. $this->assertTrue(true);
  364. }
  365. /**
  366. * @expectedException \Dotenv\Exception\ValidationException
  367. * @expectedExceptionMessage One or more environment variables failed assertions: FOO does not match "/^([[:lower:]]{1})$/".
  368. */
  369. public function testDotenvRegexMatchFail()
  370. {
  371. $dotenv = Dotenv::create($this->fixturesFolder);
  372. $dotenv->load();
  373. $dotenv->required('FOO')->allowedRegexValues('/^([[:lower:]]{1})$/');
  374. }
  375. /**
  376. * @expectedException \Dotenv\Exception\ValidationException
  377. * @expectedExceptionMessage One or more environment variables failed assertions: FOO does not match "/([[:lower:]{1{".
  378. */
  379. public function testDotenvRegexMatchError()
  380. {
  381. $dotenv = Dotenv::create($this->fixturesFolder);
  382. $dotenv->load();
  383. $dotenv->required('FOO')->allowedRegexValues('/([[:lower:]{1{');
  384. }
  385. public function testDotenvRegexMatchNotPresent()
  386. {
  387. $dotenv = Dotenv::create($this->fixturesFolder);
  388. $dotenv->load();
  389. $dotenv->ifPresent('FOOOOOOOOOOO')->allowedRegexValues('([[:lower:]]{3})');
  390. $this->assertTrue(true);
  391. }
  392. }