123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745 |
- <?php
- namespace Tests\Feature\Models;
- use App\Models\TwoFAccount;
- use App\Models\User;
- use Illuminate\Http\Testing\FileFactory;
- use Illuminate\Support\Facades\Http;
- use Illuminate\Support\Facades\Storage;
- use Tests\Data\HttpRequestTestData;
- use Tests\Data\OtpTestData;
- use Tests\FeatureTestCase;
- /**
- * @covers \App\Models\TwoFAccount
- */
- class TwoFAccountModelTest extends FeatureTestCase
- {
- /**
- * @var \App\Models\User|\Illuminate\Contracts\Auth\Authenticatable
- */
- protected $user;
- protected $anotherUser;
- /**
- * @var \App\Models\TwoFAccount
- */
- protected $customTotpTwofaccount;
- protected $customHotpTwofaccount;
- protected $customSteamTotpTwofaccount;
- /**
- * Helpers $helpers;
- */
- protected $helpers;
- /**
- * @test
- */
- public function setUp() : void
- {
- parent::setUp();
- $this->user = User::factory()->create();
- $this->customTotpTwofaccount = TwoFAccount::factory()->for($this->user)->create([
- 'legacy_uri' => OtpTestData::TOTP_FULL_CUSTOM_URI,
- 'service' => OtpTestData::SERVICE,
- 'account' => OtpTestData::ACCOUNT,
- 'icon' => OtpTestData::ICON_PNG,
- 'otp_type' => 'totp',
- 'secret' => OtpTestData::SECRET,
- 'digits' => OtpTestData::DIGITS_CUSTOM,
- 'algorithm' => OtpTestData::ALGORITHM_CUSTOM,
- 'period' => OtpTestData::PERIOD_CUSTOM,
- 'counter' => null,
- ]);
- $this->customHotpTwofaccount = TwoFAccount::factory()->for($this->user)->create([
- 'legacy_uri' => OtpTestData::HOTP_FULL_CUSTOM_URI,
- 'service' => OtpTestData::SERVICE,
- 'account' => OtpTestData::ACCOUNT,
- 'icon' => OtpTestData::ICON_PNG,
- 'otp_type' => 'hotp',
- 'secret' => OtpTestData::SECRET,
- 'digits' => OtpTestData::DIGITS_CUSTOM,
- 'algorithm' => OtpTestData::ALGORITHM_CUSTOM,
- 'period' => null,
- 'counter' => OtpTestData::COUNTER_CUSTOM,
- ]);
- $this->customSteamTotpTwofaccount = TwoFAccount::factory()->for($this->user)->create([
- 'legacy_uri' => OtpTestData::STEAM_TOTP_URI,
- 'service' => OtpTestData::STEAM,
- 'account' => OtpTestData::ACCOUNT,
- 'otp_type' => 'steamtotp',
- 'secret' => OtpTestData::STEAM_SECRET,
- 'digits' => OtpTestData::DIGITS_STEAM,
- 'algorithm' => OtpTestData::ALGORITHM_DEFAULT,
- 'period' => OtpTestData::PERIOD_DEFAULT,
- 'counter' => null,
- ]);
- }
- /**
- * @test
- */
- public function test_fill_with_custom_totp_uri_returns_correct_value()
- {
- $file = (new FileFactory)->image('file.png', 10, 10);
- Http::preventStrayRequests();
- Http::fake([
- 'https://en.opensuse.org/images/4/44/Button-filled-colour.png' => Http::response($file->tempFile, 200),
- ]);
- Storage::fake('imagesLink');
- Storage::fake('icons');
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithURI(OtpTestData::TOTP_FULL_CUSTOM_URI);
- $this->assertEquals('totp', $twofaccount->otp_type);
- $this->assertEquals(OtpTestData::TOTP_FULL_CUSTOM_URI, $twofaccount->legacy_uri);
- $this->assertEquals(OtpTestData::SERVICE, $twofaccount->service);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_CUSTOM, $twofaccount->digits);
- $this->assertEquals(OtpTestData::PERIOD_CUSTOM, $twofaccount->period);
- $this->assertEquals(null, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_CUSTOM, $twofaccount->algorithm);
- $this->assertNotNull($twofaccount->icon);
- Storage::disk('icons')->assertExists($twofaccount->icon);
- Storage::disk('imagesLink')->assertMissing($twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_fill_with_basic_totp_uri_returns_default_value()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithURI(OtpTestData::TOTP_SHORT_URI);
- $this->assertEquals('totp', $twofaccount->otp_type);
- $this->assertEquals(OtpTestData::TOTP_SHORT_URI, $twofaccount->legacy_uri);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(null, $twofaccount->service);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_DEFAULT, $twofaccount->digits);
- $this->assertEquals(OtpTestData::PERIOD_DEFAULT, $twofaccount->period);
- $this->assertEquals(null, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_DEFAULT, $twofaccount->algorithm);
- $this->assertEquals(null, $twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_fill_with_custom_hotp_uri_returns_correct_value()
- {
- $file = (new FileFactory)->image('file.png', 10, 10);
- Http::preventStrayRequests();
- Http::fake([
- 'https://en.opensuse.org/images/4/44/Button-filled-colour.png' => Http::response($file->tempFile, 200),
- ]);
- Storage::fake('imagesLink');
- Storage::fake('icons');
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithURI(OtpTestData::HOTP_FULL_CUSTOM_URI);
- $this->assertEquals('hotp', $twofaccount->otp_type);
- $this->assertEquals(OtpTestData::HOTP_FULL_CUSTOM_URI, $twofaccount->legacy_uri);
- $this->assertEquals(OtpTestData::SERVICE, $twofaccount->service);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_CUSTOM, $twofaccount->digits);
- $this->assertEquals(null, $twofaccount->period);
- $this->assertEquals(OtpTestData::COUNTER_CUSTOM, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_CUSTOM, $twofaccount->algorithm);
- $this->assertNotNull($twofaccount->icon);
- Storage::disk('icons')->assertExists($twofaccount->icon);
- Storage::disk('imagesLink')->assertMissing($twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_fill_with_basic_hotp_uri_returns_default_value()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithURI(OtpTestData::HOTP_SHORT_URI);
- $this->assertEquals('hotp', $twofaccount->otp_type);
- $this->assertEquals(OtpTestData::HOTP_SHORT_URI, $twofaccount->legacy_uri);
- $this->assertEquals(null, $twofaccount->service);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_DEFAULT, $twofaccount->digits);
- $this->assertEquals(null, $twofaccount->period);
- $this->assertEquals(OtpTestData::COUNTER_DEFAULT, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_DEFAULT, $twofaccount->algorithm);
- $this->assertEquals(null, $twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_filled_with_uri_persists_correct_values_to_db()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithURI(OtpTestData::TOTP_SHORT_URI);
- $twofaccount->save();
- $this->assertDatabaseHas('twofaccounts', [
- 'otp_type' => 'totp',
- 'legacy_uri' => OtpTestData::TOTP_SHORT_URI,
- 'service' => null,
- 'account' => OtpTestData::ACCOUNT,
- 'secret' => OtpTestData::SECRET,
- 'digits' => OtpTestData::DIGITS_DEFAULT,
- 'period' => OtpTestData::PERIOD_DEFAULT,
- 'counter' => null,
- 'algorithm' => OtpTestData::ALGORITHM_DEFAULT,
- 'icon' => null,
- ]);
- }
- /**
- * @test
- */
- public function test_fill_with_invalid_uri_returns_ValidationException()
- {
- $this->expectException(\Illuminate\Validation\ValidationException::class);
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithURI(OtpTestData::INVALID_OTPAUTH_URI);
- }
- /**
- * @test
- */
- public function test_fill_with_uri_without_label_returns_ValidationException()
- {
- $this->expectException(\Illuminate\Validation\ValidationException::class);
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithURI('otpauth://totp/?secret=' . OtpTestData::SECRET);
- }
- /**
- * @test
- */
- public function test_create_custom_totp_from_parameters_returns_correct_value()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_FULL_VALID_PARAMETERS_FOR_CUSTOM_TOTP);
- $this->assertEquals('totp', $twofaccount->otp_type);
- $this->assertEquals(OtpTestData::SERVICE, $twofaccount->service);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_CUSTOM, $twofaccount->digits);
- $this->assertEquals(OtpTestData::PERIOD_CUSTOM, $twofaccount->period);
- $this->assertEquals(null, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_CUSTOM, $twofaccount->algorithm);
- $this->assertStringEndsWith('.png', $twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_create_basic_totp_from_parameters_returns_correct_value()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_MINIMUM_VALID_PARAMETERS_FOR_TOTP);
- $this->assertEquals('totp', $twofaccount->otp_type);
- $this->assertEquals(null, $twofaccount->service);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_DEFAULT, $twofaccount->digits);
- $this->assertEquals(OtpTestData::PERIOD_DEFAULT, $twofaccount->period);
- $this->assertEquals(null, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_DEFAULT, $twofaccount->algorithm);
- $this->assertEquals(null, $twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_create_custom_hotp_from_parameters_returns_correct_value()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_FULL_VALID_PARAMETERS_FOR_CUSTOM_HOTP);
- $this->assertEquals('hotp', $twofaccount->otp_type);
- $this->assertEquals(OtpTestData::SERVICE, $twofaccount->service);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_CUSTOM, $twofaccount->digits);
- $this->assertEquals(null, $twofaccount->period);
- $this->assertEquals(OtpTestData::COUNTER_CUSTOM, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_CUSTOM, $twofaccount->algorithm);
- $this->assertStringEndsWith('.png', $twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_create_basic_hotp_from_parameters_returns_correct_value()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_MINIMUM_VALID_PARAMETERS_FOR_HOTP);
- $this->assertEquals('hotp', $twofaccount->otp_type);
- $this->assertEquals(null, $twofaccount->service);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_DEFAULT, $twofaccount->digits);
- $this->assertEquals(null, $twofaccount->period);
- $this->assertEquals(OtpTestData::COUNTER_DEFAULT, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_DEFAULT, $twofaccount->algorithm);
- $this->assertEquals(null, $twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_create_from_parameters_persists_correct_values_to_db()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_MINIMUM_VALID_PARAMETERS_FOR_TOTP);
- $twofaccount->save();
- $this->assertDatabaseHas('twofaccounts', [
- 'otp_type' => 'totp',
- 'legacy_uri' => OtpTestData::TOTP_SHORT_URI,
- 'service' => null,
- 'account' => OtpTestData::ACCOUNT,
- 'secret' => OtpTestData::SECRET,
- 'digits' => OtpTestData::DIGITS_DEFAULT,
- 'period' => OtpTestData::PERIOD_DEFAULT,
- 'counter' => null,
- 'algorithm' => OtpTestData::ALGORITHM_DEFAULT,
- 'icon' => null,
- ]);
- }
- /**
- * @test
- */
- public function test_create_from_unsupported_parameters_returns_unsupportedOtpTypeException()
- {
- $this->expectException(\App\Exceptions\UnsupportedOtpTypeException::class);
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_PARAMETERS_FOR_UNSUPPORTED_OTP_TYPE);
- }
- /**
- * @test
- */
- public function test_create_from_invalid_parameters_type_returns_InvalidOtpParameterException()
- {
- $this->expectException(\App\Exceptions\InvalidOtpParameterException::class);
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithOtpParameters([
- 'account' => OtpTestData::ACCOUNT,
- 'otp_type' => 'totp',
- 'digits' => 'notsupported',
- ]);
- }
- /**
- * @test
- */
- public function test_create_from_invalid_parameters_returns_InvalidOtpParameterException()
- {
- $this->expectException(\App\Exceptions\InvalidOtpParameterException::class);
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithOtpParameters([
- 'account' => OtpTestData::ACCOUNT,
- 'otp_type' => 'totp',
- 'algorithm' => 'notsupported',
- ]);
- }
- /**
- * @test
- */
- public function test_update_totp_returns_updated_model()
- {
- $twofaccount = $this->customTotpTwofaccount;
- $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_MINIMUM_VALID_PARAMETERS_FOR_TOTP);
- $this->assertEquals('totp', $twofaccount->otp_type);
- $this->assertEquals(null, $twofaccount->service);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_DEFAULT, $twofaccount->digits);
- $this->assertEquals(OtpTestData::PERIOD_DEFAULT, $twofaccount->period);
- $this->assertEquals(null, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_DEFAULT, $twofaccount->algorithm);
- $this->assertEquals(null, $twofaccount->counter);
- $this->assertEquals(null, $twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_update_hotp_returns_updated_model()
- {
- $twofaccount = $this->customTotpTwofaccount;
- $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_MINIMUM_VALID_PARAMETERS_FOR_HOTP);
- $this->assertEquals('hotp', $twofaccount->otp_type);
- $this->assertEquals(null, $twofaccount->service);
- $this->assertEquals(OtpTestData::ACCOUNT, $twofaccount->account);
- $this->assertEquals(OtpTestData::SECRET, $twofaccount->secret);
- $this->assertEquals(OtpTestData::DIGITS_DEFAULT, $twofaccount->digits);
- $this->assertEquals(null, $twofaccount->period);
- $this->assertEquals(OtpTestData::COUNTER_DEFAULT, $twofaccount->counter);
- $this->assertEquals(OtpTestData::ALGORITHM_DEFAULT, $twofaccount->algorithm);
- $this->assertEquals(null, $twofaccount->counter);
- $this->assertEquals(null, $twofaccount->icon);
- }
- /**
- * @test
- */
- public function test_update_totp_persists_updated_model()
- {
- $twofaccount = $this->customTotpTwofaccount;
- $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_MINIMUM_VALID_PARAMETERS_FOR_TOTP);
- $twofaccount->save();
- $this->assertDatabaseHas('twofaccounts', [
- 'otp_type' => 'totp',
- 'service' => null,
- 'account' => OtpTestData::ACCOUNT,
- 'secret' => OtpTestData::SECRET,
- 'digits' => OtpTestData::DIGITS_DEFAULT,
- 'period' => OtpTestData::PERIOD_DEFAULT,
- 'counter' => null,
- 'algorithm' => OtpTestData::ALGORITHM_DEFAULT,
- 'icon' => null,
- ]);
- }
- /**
- * @test
- */
- public function test_getOTP_for_totp_returns_the_same_password()
- {
- Http::preventStrayRequests();
- Http::fake([
- 'https://en.opensuse.org/images/4/44/Button-filled-colour.png' => Http::response(HttpRequestTestData::ICON_PNG, 200),
- ]);
- Storage::fake('imagesLink');
- Storage::fake('icons');
- $twofaccount = new TwoFAccount;
- $otp_from_model = $this->customTotpTwofaccount->getOTP();
- $otp_from_uri = $twofaccount->fillWithURI(OtpTestData::TOTP_FULL_CUSTOM_URI)->getOTP();
- if ($otp_from_model->generated_at === $otp_from_uri->generated_at) {
- $this->assertEquals($otp_from_model, $otp_from_uri);
- }
- $otp_from_model = $this->customTotpTwofaccount->getOTP();
- $otp_from_parameters = $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_FULL_VALID_PARAMETERS_FOR_CUSTOM_TOTP)->getOTP();
- if ($otp_from_model->generated_at === $otp_from_parameters->generated_at) {
- $this->assertEquals($otp_from_model, $otp_from_parameters);
- }
- }
- /**
- * @test
- */
- public function test_getOTP_for_hotp_returns_the_same_password()
- {
- Http::preventStrayRequests();
- Http::fake([
- 'https://en.opensuse.org/images/4/44/Button-filled-colour.png' => Http::response(HttpRequestTestData::ICON_PNG, 200),
- ]);
- Storage::fake('imagesLink');
- Storage::fake('icons');
- $twofaccount = new TwoFAccount;
- $otp_from_model = $this->customHotpTwofaccount->getOTP();
- $otp_from_uri = $twofaccount->fillWithURI(OtpTestData::HOTP_FULL_CUSTOM_URI)->getOTP();
- $this->assertEquals($otp_from_model, $otp_from_uri);
- $otp_from_parameters = $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_FULL_VALID_PARAMETERS_FOR_CUSTOM_HOTP)->getOTP();
- $this->assertEquals($otp_from_model, $otp_from_parameters);
- }
- /**
- * @test
- */
- public function test_getOTP_for_steamtotp_returns_the_same_password()
- {
- $twofaccount = new TwoFAccount;
- $otp_from_model = $this->customSteamTotpTwofaccount->getOTP();
- $otp_from_uri = $twofaccount->fillWithURI(OtpTestData::STEAM_TOTP_URI)->getOTP();
- if ($otp_from_model->generated_at === $otp_from_uri->generated_at) {
- $this->assertEquals($otp_from_model, $otp_from_uri);
- }
- $otp_from_model = $this->customSteamTotpTwofaccount->getOTP();
- $otp_from_parameters = $twofaccount->fillWithOtpParameters(OtpTestData::ARRAY_OF_FULL_VALID_PARAMETERS_FOR_STEAM_TOTP)->getOTP();
- if ($otp_from_model->generated_at === $otp_from_parameters->generated_at) {
- $this->assertEquals($otp_from_model, $otp_from_parameters);
- }
- }
- /**
- * @test
- */
- public function test_getOTP_for_totp_with_invalid_secret_returns_InvalidSecretException()
- {
- $twofaccount = new TwoFAccount;
- $this->expectException(\App\Exceptions\InvalidSecretException::class);
- $otp_from_uri = $twofaccount->fillWithURI('otpauth://totp/' . OtpTestData::ACCOUNT . '?secret=1.0')->getOTP();
- }
- /**
- * @test
- */
- public function test_getOTP_for_totp_with_undecipherable_secret_returns_UndecipherableException()
- {
- $twofaccount = new TwoFAccount;
- $this->expectException(\App\Exceptions\UndecipherableException::class);
- $otp_from_uri = $twofaccount->fillWithOtpParameters([
- 'account' => OtpTestData::ACCOUNT,
- 'otp_type' => 'totp',
- 'secret' => __('errors.indecipherable'),
- ])->getOTP();
- }
- /**
- * @test
- */
- public function test_getURI_for_custom_totp_model_returns_uri()
- {
- $uri = $this->customTotpTwofaccount->getURI();
- $this->assertStringContainsString('otpauth://totp/', $uri);
- $this->assertStringContainsString(OtpTestData::SERVICE, $uri);
- $this->assertStringContainsString(OtpTestData::ACCOUNT, $uri);
- $this->assertStringContainsString('secret=' . OtpTestData::SECRET, $uri);
- $this->assertStringContainsString('digits=' . OtpTestData::DIGITS_CUSTOM, $uri);
- $this->assertStringContainsString('period=' . OtpTestData::PERIOD_CUSTOM, $uri);
- $this->assertStringContainsString('algorithm=' . OtpTestData::ALGORITHM_CUSTOM, $uri);
- }
- /**
- * @test
- */
- public function test_getURI_for_custom_hotp_model_returns_uri()
- {
- $uri = $this->customHotpTwofaccount->getURI();
- $this->assertStringContainsString('otpauth://hotp/', $uri);
- $this->assertStringContainsString(OtpTestData::SERVICE, $uri);
- $this->assertStringContainsString(OtpTestData::ACCOUNT, $uri);
- $this->assertStringContainsString('secret=' . OtpTestData::SECRET, $uri);
- $this->assertStringContainsString('digits=' . OtpTestData::DIGITS_CUSTOM, $uri);
- $this->assertStringContainsString('counter=' . OtpTestData::COUNTER_CUSTOM, $uri);
- $this->assertStringContainsString('algorithm=' . OtpTestData::ALGORITHM_CUSTOM, $uri);
- }
- /**
- * @test
- */
- public function test_fill_succeed_when_image_fetching_fails()
- {
- Http::preventStrayRequests();
- Storage::fake('imagesLink');
- Storage::fake('icons');
- $twofaccount = new TwoFAccount;
- $twofaccount->fillWithURI(OtpTestData::TOTP_FULL_CUSTOM_URI);
- Storage::disk('icons')->assertDirectoryEmpty('/');
- Storage::disk('imagesLink')->assertDirectoryEmpty('/');
- }
- /**
- * @test
- */
- public function test_saving_totp_without_period_set_default_one()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->service = OtpTestData::SERVICE;
- $twofaccount->account = OtpTestData::ACCOUNT;
- $twofaccount->otp_type = TwoFAccount::TOTP;
- $twofaccount->secret = OtpTestData::SECRET;
- $twofaccount->save();
- $account = TwoFAccount::find($twofaccount->id);
- $this->assertEquals(TwoFAccount::DEFAULT_PERIOD, $account->period);
- }
- /**
- * @test
- */
- public function test_saving_hotp_without_counter_set_default_one()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->service = OtpTestData::SERVICE;
- $twofaccount->account = OtpTestData::ACCOUNT;
- $twofaccount->otp_type = TwoFAccount::HOTP;
- $twofaccount->secret = OtpTestData::SECRET;
- $twofaccount->save();
- $account = TwoFAccount::find($twofaccount->id);
- $this->assertEquals(TwoFAccount::DEFAULT_COUNTER, $account->counter);
- }
- /**
- * @test
- */
- public function test_equals_returns_true()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->legacy_uri = OtpTestData::TOTP_FULL_CUSTOM_URI;
- $twofaccount->service = OtpTestData::SERVICE;
- $twofaccount->account = OtpTestData::ACCOUNT;
- $twofaccount->icon = OtpTestData::ICON_PNG;
- $twofaccount->otp_type = 'totp';
- $twofaccount->secret = OtpTestData::SECRET;
- $twofaccount->digits = OtpTestData::DIGITS_CUSTOM;
- $twofaccount->algorithm = OtpTestData::ALGORITHM_CUSTOM;
- $twofaccount->period = OtpTestData::PERIOD_CUSTOM;
- $twofaccount->counter = null;
- $twofaccount->save();
- $this->assertTrue($twofaccount->equals($this->customTotpTwofaccount));
- }
- /**
- * @test
- */
- public function test_equals_returns_false()
- {
- $twofaccount = new TwoFAccount;
- $twofaccount->legacy_uri = OtpTestData::TOTP_FULL_CUSTOM_URI;
- $twofaccount->service = OtpTestData::SERVICE;
- $twofaccount->account = OtpTestData::ACCOUNT;
- $twofaccount->icon = OtpTestData::ICON_PNG;
- $twofaccount->otp_type = 'totp';
- $twofaccount->secret = OtpTestData::SECRET;
- $twofaccount->digits = OtpTestData::DIGITS_CUSTOM;
- $twofaccount->algorithm = OtpTestData::ALGORITHM_CUSTOM;
- $twofaccount->period = OtpTestData::PERIOD_CUSTOM;
- $twofaccount->counter = null;
- $twofaccount->save();
- $this->assertFalse($twofaccount->equals($this->customHotpTwofaccount));
- }
- /**
- * @test
- *
- * @dataProvider iconResourceProvider
- */
- public function test_set_icon_stores_and_set_the_icon($res, $ext)
- {
- Storage::fake('imagesLink');
- Storage::fake('icons');
- $previousIcon = $this->customTotpTwofaccount->icon;
- $this->customTotpTwofaccount->setIcon($res, $ext);
- $this->assertNotEquals($previousIcon, $this->customTotpTwofaccount->icon);
- Storage::disk('icons')->assertExists($this->customTotpTwofaccount->icon);
- Storage::disk('imagesLink')->assertMissing($this->customTotpTwofaccount->icon);
- }
- /**
- * Provide data for Icon store tests
- */
- public function iconResourceProvider()
- {
- return [
- 'PNG' => [
- base64_decode(OtpTestData::ICON_PNG_DATA),
- 'png',
- ],
- 'JPG' => [
- base64_decode(OtpTestData::ICON_JPEG_DATA),
- 'jpg',
- ],
- 'WEBP' => [
- base64_decode(OtpTestData::ICON_WEBP_DATA),
- 'webp',
- ],
- 'BMP' => [
- base64_decode(OtpTestData::ICON_BMP_DATA),
- 'bmp',
- ],
- 'SVG' => [
- OtpTestData::ICON_SVG_DATA,
- 'svg',
- ],
- ];
- }
- /**
- * @test
- *
- * @dataProvider invalidIconResourceProvider
- */
- public function test_set_invalid_icon_ends_without_error($res, $ext)
- {
- Storage::fake('imagesLink');
- Storage::fake('icons');
- $previousIcon = $this->customTotpTwofaccount->icon;
- $this->customTotpTwofaccount->setIcon($res, $ext);
- $this->assertEquals($previousIcon, $this->customTotpTwofaccount->icon);
- Storage::disk('icons')->assertMissing($this->customTotpTwofaccount->icon);
- Storage::disk('imagesLink')->assertMissing($this->customTotpTwofaccount->icon);
- }
- /**
- * Provide data for Icon store tests
- */
- public function invalidIconResourceProvider()
- {
- return [
- 'INVALID_PNG' => [
- 'lkjdslfkjslkdfjlskdjflksjf',
- 'png',
- ],
- ];
- }
- }
|