|
|
|
@ -34,6 +34,7 @@ use OCP\Http\Client\IClient;
|
|
|
|
|
use OCP\Http\Client\IClientService;
|
|
|
|
|
use OCP\Http\Client\IResponse;
|
|
|
|
|
use OCP\IConfig;
|
|
|
|
|
use OCP\Support\Subscription\IRegistry;
|
|
|
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
|
use Test\TestCase;
|
|
|
|
|
|
|
|
|
@ -50,6 +51,8 @@ class AppFetcherTest extends TestCase {
|
|
|
|
|
protected $compareVersion;
|
|
|
|
|
/** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */
|
|
|
|
|
protected $logger;
|
|
|
|
|
/** @var IRegistry */
|
|
|
|
|
protected $registry;
|
|
|
|
|
/** @var AppFetcher */
|
|
|
|
|
protected $fetcher;
|
|
|
|
|
/** @var string */
|
|
|
|
@ -1849,6 +1852,7 @@ EJL3BaQAQaASSsvFrcozYxrQG4VzEg==
|
|
|
|
|
$this->config = $this->createMock(IConfig::class);
|
|
|
|
|
$this->compareVersion = new CompareVersion();
|
|
|
|
|
$this->logger = $this->createMock(LoggerInterface::class);
|
|
|
|
|
$this->registry = $this->createMock(IRegistry::class);
|
|
|
|
|
|
|
|
|
|
$this->fetcher = new AppFetcher(
|
|
|
|
|
$factory,
|
|
|
|
@ -1856,7 +1860,8 @@ EJL3BaQAQaASSsvFrcozYxrQG4VzEg==
|
|
|
|
|
$this->timeFactory,
|
|
|
|
|
$this->config,
|
|
|
|
|
$this->compareVersion,
|
|
|
|
|
$this->logger
|
|
|
|
|
$this->logger,
|
|
|
|
|
$this->registry
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2061,4 +2066,76 @@ EJL3BaQAQaASSsvFrcozYxrQG4VzEg==
|
|
|
|
|
$this->fetcher->setVersion('11.0.0.2', 'future-apps.json', false);
|
|
|
|
|
$this->assertEquals(self::$expectedResponse['data'], $this->fetcher->get());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetWhitelist() {
|
|
|
|
|
$this->config->method('getSystemValue')
|
|
|
|
|
->willReturnCallback(function ($key, $default) {
|
|
|
|
|
if ($key === 'appstoreenabled') {
|
|
|
|
|
return true;
|
|
|
|
|
} elseif ($key === 'version') {
|
|
|
|
|
return '11.0.0.2';
|
|
|
|
|
} elseif ($key === 'appstoreurl' && $default === 'https://apps.nextcloud.com/api/v1') {
|
|
|
|
|
return 'https://custom.appsstore.endpoint/api/v1';
|
|
|
|
|
} elseif ($key === 'appsallowlist') {
|
|
|
|
|
return ['contacts'];
|
|
|
|
|
} else {
|
|
|
|
|
return $default;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$file = $this->createMock(ISimpleFile::class);
|
|
|
|
|
$folder = $this->createMock(ISimpleFolder::class);
|
|
|
|
|
$folder
|
|
|
|
|
->expects($this->at(0))
|
|
|
|
|
->method('getFile')
|
|
|
|
|
->with('apps.json')
|
|
|
|
|
->willThrowException(new NotFoundException());
|
|
|
|
|
$folder
|
|
|
|
|
->expects($this->at(1))
|
|
|
|
|
->method('newFile')
|
|
|
|
|
->with('apps.json')
|
|
|
|
|
->willReturn($file);
|
|
|
|
|
$this->appData
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('getFolder')
|
|
|
|
|
->with('/')
|
|
|
|
|
->willReturn($folder);
|
|
|
|
|
$client = $this->createMock(IClient::class);
|
|
|
|
|
$this->clientService
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('newClient')
|
|
|
|
|
->willReturn($client);
|
|
|
|
|
$response = $this->createMock(IResponse::class);
|
|
|
|
|
$client
|
|
|
|
|
->method('get')
|
|
|
|
|
->with('https://custom.appsstore.endpoint/api/v1/apps.json')
|
|
|
|
|
->willReturn($response);
|
|
|
|
|
$response
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('getBody')
|
|
|
|
|
->willReturn(self::$responseJson);
|
|
|
|
|
$response->method('getHeader')
|
|
|
|
|
->with($this->equalTo('ETag'))
|
|
|
|
|
->willReturn('"myETag"');
|
|
|
|
|
$this->timeFactory
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('getTime')
|
|
|
|
|
->willReturn(1234);
|
|
|
|
|
|
|
|
|
|
$this->registry
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('delegateHasValidSubscription')
|
|
|
|
|
->willReturn(true);
|
|
|
|
|
|
|
|
|
|
$file
|
|
|
|
|
->expects($this->once())
|
|
|
|
|
->method('putContent');
|
|
|
|
|
$file
|
|
|
|
|
->method('getContent')
|
|
|
|
|
->willReturn(json_encode(self::$expectedResponse));
|
|
|
|
|
|
|
|
|
|
$apps = array_values($this->fetcher->get());
|
|
|
|
|
$this->assertEquals(count($apps), 1);
|
|
|
|
|
$this->assertEquals($apps[0]['id'], 'contacts');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|