SubjectTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. namespace fphammerle\yii2\auth\clientcert\tests;
  3. use \fphammerle\helpers\ArrayHelper;
  4. use \fphammerle\yii2\auth\clientcert\Subject;
  5. use \fphammerle\yii2\auth\clientcert\migrations;
  6. class DummyUser implements \yii\web\IdentityInterface
  7. {
  8. public static function findIdentity($id) {}
  9. public static function findIdentityByAccessToken($token, $type = null) {}
  10. public function getId() {}
  11. public function getAuthKey() {}
  12. public function validateAuthKey($authKey) {}
  13. }
  14. class SubjectTest extends TestCase
  15. {
  16. protected $alice;
  17. protected $bob;
  18. protected function setUp()
  19. {
  20. $this->mockApplication();
  21. ob_start();
  22. (new migrations\CreateSubjectTable)->up();
  23. ob_end_clean();
  24. $this->alice = new models\User('alice');
  25. $this->bob = new models\User('bob');
  26. $this->assertTrue($this->alice->save());
  27. $this->assertTrue($this->bob->save());
  28. }
  29. public function testCreateModel()
  30. {
  31. (new Subject($this->alice, 'CN=Alice,C=AT'))->save();
  32. (new Subject($this->alice, 'CN=Alice,O=Office,C=AT'))->save();
  33. (new Subject($this->bob, 'CN=Bob,C=AT'))->save();
  34. $subjects = ArrayHelper::map(
  35. Subject::find()->all(),
  36. function($s) { return $s->getAttributes(); }
  37. );
  38. $this->assertEquals(3, sizeof($subjects));
  39. ArrayHelper::map(
  40. [['id' => 1, 'identity_id' => $this->alice->id, 'distinguished_name' => 'CN=Alice,C=AT'],
  41. ['id' => 2, 'identity_id' => $this->alice->id, 'distinguished_name' => 'CN=Alice,O=Office,C=AT'],
  42. ['id' => 3, 'identity_id' => $this->bob->id, 'distinguished_name' => 'CN=Bob,C=AT']],
  43. function($a) use ($subjects) {
  44. $this->assertContains($a, $subjects);
  45. }
  46. );
  47. }
  48. public function testDNUnique()
  49. {
  50. $this->assertTrue((new Subject($this->alice, 'CN=Alice,C=AT'))->save());
  51. $this->assertTrue((new Subject($this->bob, 'CN=Bob,C=AT'))->save());
  52. $dup = new Subject($this->alice, 'CN=Alice,C=AT');
  53. $this->assertFalse($dup->save());
  54. $this->assertEquals(1, sizeof($dup->getErrors()));
  55. $this->assertEquals(1, sizeof($dup->getErrors('distinguished_name')));
  56. }
  57. public function testGetIdentity()
  58. {
  59. $s = new Subject;
  60. $this->assertNull($s->identity);
  61. $s = new Subject($this->alice, 'CN=Alice,C=AT');
  62. $this->assertEquals($this->alice->id, $s->identity_id);
  63. $this->assertInstanceOf(models\User::className(), $s->identity);
  64. $this->assertEquals($this->alice->id, $s->identity->id);
  65. $s->identity_id = $this->bob->id;
  66. $s->save();
  67. $s = Subject::findOne(['identity_id' => $this->bob->id]);
  68. $this->assertEquals($this->bob->id, $s->identity_id);
  69. $this->assertInstanceOf(models\User::className(), $s->identity);
  70. $this->assertEquals($this->bob->id, $s->identity->id);
  71. }
  72. public function testSetIdentity()
  73. {
  74. $s = new Subject($this->alice, 'CN=Alice,C=AT');
  75. $this->assertInstanceOf(models\User::className(), $s->identity);
  76. $this->assertEquals($this->alice->id, $s->identity->id);
  77. $s->identity = $this->bob;
  78. $this->assertEquals($this->bob->id, $s->identity_id);
  79. // TODO: $this->assertEquals($this->bob->id, $s->identity->id);
  80. $s->save();
  81. $s = Subject::findOne(['identity_id' => $this->bob->id]);
  82. $this->assertEquals($this->bob->id, $s->identity_id);
  83. $this->assertEquals($this->bob->id, $s->identity->id);
  84. $s->identity = null;
  85. $this->assertNull($s->identity_id);
  86. }
  87. public function testSetIdentityInvalidType()
  88. {
  89. $s = new Subject;
  90. $this->setExpectedException(\TypeError::class);
  91. $s->identity = new DummyUser;
  92. }
  93. public function testConstructInvalidType()
  94. {
  95. $this->setExpectedException(\TypeError::class);
  96. new Subject(new DummyUser);
  97. }
  98. public function testFindByDN()
  99. {
  100. $a1 = new Subject($this->alice, 'CN=Alice,C=AT');
  101. $a2 = new Subject($this->alice, 'CN=Alice,O=Office,C=AT');
  102. $b = new Subject($this->bob, 'CN=Bob,C=AT');
  103. $a1->save();
  104. $a2->save();
  105. $b->save();
  106. $this->assertEquals(
  107. $a1->id,
  108. Subject::findByDistinguishedName('CN=Alice,C=AT')->id
  109. );
  110. $this->assertEquals(
  111. $a2->id,
  112. Subject::findByDistinguishedName('CN=Alice,O=Office,C=AT')->id
  113. );
  114. $this->assertNull(
  115. Subject::findByDistinguishedName('CN=Bob,O=Office,C=AT')
  116. );
  117. }
  118. }