expectException(\InvalidArgumentException::class); Otpauth::fromString($string); } public function testRejectsMissingSecretInformation(): void { $string = 'otpauth://totp/ACME%20Co:john.doe@email.com?issuer=ACME%20Co&algorithm=MD5&digits=8&period=60'; $this->expectException(\InvalidArgumentException::class); Otpauth::fromString($string); } public function testPreservesAllUriFields(): void { $string = 'otpauth://totp/ACME%20Co:john.doe@email.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=MD5&digits=8&period=60'; $queryComponents = [ "secret" => "HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ", "issuer" => "ACME Co", "algorithm" => "MD5", "digits" => 8, "period" => 60,]; $provisioningUri = Otpauth::fromString($string); $this->assertSame($provisioningUri->issuer, $queryComponents['issuer']); $this->assertSame($provisioningUri->digits, $queryComponents['digits']); $this->assertSame($provisioningUri->period, $queryComponents['period']); $this->assertSame($provisioningUri->algorithm, $queryComponents['algorithm']); $calculatedUrl = $provisioningUri->emitStr(); $parsedOtp = \parse_url($calculatedUrl); $parsedTest = \parse_url($string); $parsedOtpQuery = []; $parsedTestQuery = []; \parse_str($parsedOtp['query'], $parsedOtpQuery); unset($parsedOtp['query']); \parse_str($parsedTest['query'], $parsedTestQuery); unset($parsedTest['query']); $this->assertEqualsCanonicalizing($parsedOtp, $parsedTest); $this->assertEqualsCanonicalizing($parsedOtpQuery, $parsedTestQuery); } public function testCanFallbackToDefaults(): void { $string = 'otpauth://totp/Example:john.doe@email.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ'; $queryComponents = [ "secret" => "HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ", "issuer" => "Example", "algorithm" => "SHA1", "digits" => 6, "period" => 30,]; $provisioningUri = Otpauth::fromString($string); $this->assertSame($provisioningUri->algorithm, $queryComponents['algorithm']); $this->assertSame($provisioningUri->digits, $queryComponents['digits']); $this->assertSame($provisioningUri->period, $queryComponents['period']); $this->assertSame($provisioningUri->issuer, $queryComponents['issuer']); } } ?>