mirror of
https://github.com/nextcloud/server.git
synced 2026-02-03 20:41:22 -05:00
Merge pull request #57533 from nextcloud/fix/limit-app-to-group-initial-state
fix(app-settings): limit app to group initial state
This commit is contained in:
commit
b5092e598f
3 changed files with 57 additions and 2 deletions
|
|
@ -69,6 +69,7 @@ class AppSettingsController extends Controller {
|
||||||
private CategoryFetcher $categoryFetcher,
|
private CategoryFetcher $categoryFetcher,
|
||||||
private AppFetcher $appFetcher,
|
private AppFetcher $appFetcher,
|
||||||
private IFactory $l10nFactory,
|
private IFactory $l10nFactory,
|
||||||
|
private IGroupManager $groupManager,
|
||||||
private BundleFetcher $bundleFetcher,
|
private BundleFetcher $bundleFetcher,
|
||||||
private Installer $installer,
|
private Installer $installer,
|
||||||
private IURLGenerator $urlGenerator,
|
private IURLGenerator $urlGenerator,
|
||||||
|
|
@ -94,6 +95,13 @@ class AppSettingsController extends Controller {
|
||||||
$this->initialState->provideInitialState('appstoreBundles', $this->getBundles());
|
$this->initialState->provideInitialState('appstoreBundles', $this->getBundles());
|
||||||
$this->initialState->provideInitialState('appstoreUpdateCount', count($this->getAppsWithUpdates()));
|
$this->initialState->provideInitialState('appstoreUpdateCount', count($this->getAppsWithUpdates()));
|
||||||
|
|
||||||
|
$groups = array_map(static fn (IGroup $group): array => [
|
||||||
|
'id' => $group->getGID(),
|
||||||
|
'name' => $group->getDisplayName(),
|
||||||
|
], $this->groupManager->search('', 5));
|
||||||
|
|
||||||
|
$this->initialState->provideInitialState('usersSettings', [ 'systemGroups' => $groups]);
|
||||||
|
|
||||||
if ($this->appManager->isEnabledForAnyone('app_api')) {
|
if ($this->appManager->isEnabledForAnyone('app_api')) {
|
||||||
try {
|
try {
|
||||||
Server::get(ExAppsPageService::class)->provideAppApiState($this->initialState);
|
Server::get(ExAppsPageService::class)->provideAppApiState($this->initialState);
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,8 @@ use OCP\AppFramework\Services\IInitialState;
|
||||||
use OCP\Files\AppData\IAppDataFactory;
|
use OCP\Files\AppData\IAppDataFactory;
|
||||||
use OCP\Http\Client\IClientService;
|
use OCP\Http\Client\IClientService;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
use OCP\IGroup;
|
||||||
|
use OCP\IGroupManager;
|
||||||
use OCP\IL10N;
|
use OCP\IL10N;
|
||||||
use OCP\INavigationManager;
|
use OCP\INavigationManager;
|
||||||
use OCP\IRequest;
|
use OCP\IRequest;
|
||||||
|
|
@ -45,6 +47,7 @@ class AppSettingsControllerTest extends TestCase {
|
||||||
private CategoryFetcher&MockObject $categoryFetcher;
|
private CategoryFetcher&MockObject $categoryFetcher;
|
||||||
private AppFetcher&MockObject $appFetcher;
|
private AppFetcher&MockObject $appFetcher;
|
||||||
private IFactory&MockObject $l10nFactory;
|
private IFactory&MockObject $l10nFactory;
|
||||||
|
private IGroupManager&MockObject $groupManager;
|
||||||
private BundleFetcher&MockObject $bundleFetcher;
|
private BundleFetcher&MockObject $bundleFetcher;
|
||||||
private Installer&MockObject $installer;
|
private Installer&MockObject $installer;
|
||||||
private IURLGenerator&MockObject $urlGenerator;
|
private IURLGenerator&MockObject $urlGenerator;
|
||||||
|
|
@ -70,6 +73,7 @@ class AppSettingsControllerTest extends TestCase {
|
||||||
$this->categoryFetcher = $this->createMock(CategoryFetcher::class);
|
$this->categoryFetcher = $this->createMock(CategoryFetcher::class);
|
||||||
$this->appFetcher = $this->createMock(AppFetcher::class);
|
$this->appFetcher = $this->createMock(AppFetcher::class);
|
||||||
$this->l10nFactory = $this->createMock(IFactory::class);
|
$this->l10nFactory = $this->createMock(IFactory::class);
|
||||||
|
$this->groupManager = $this->createMock(IGroupManager::class);
|
||||||
$this->bundleFetcher = $this->createMock(BundleFetcher::class);
|
$this->bundleFetcher = $this->createMock(BundleFetcher::class);
|
||||||
$this->installer = $this->createMock(Installer::class);
|
$this->installer = $this->createMock(Installer::class);
|
||||||
$this->urlGenerator = $this->createMock(IURLGenerator::class);
|
$this->urlGenerator = $this->createMock(IURLGenerator::class);
|
||||||
|
|
@ -89,6 +93,7 @@ class AppSettingsControllerTest extends TestCase {
|
||||||
$this->categoryFetcher,
|
$this->categoryFetcher,
|
||||||
$this->appFetcher,
|
$this->appFetcher,
|
||||||
$this->l10nFactory,
|
$this->l10nFactory,
|
||||||
|
$this->groupManager,
|
||||||
$this->bundleFetcher,
|
$this->bundleFetcher,
|
||||||
$this->installer,
|
$this->installer,
|
||||||
$this->urlGenerator,
|
$this->urlGenerator,
|
||||||
|
|
@ -168,9 +173,16 @@ class AppSettingsControllerTest extends TestCase {
|
||||||
->expects($this->once())
|
->expects($this->once())
|
||||||
->method('setActiveEntry')
|
->method('setActiveEntry')
|
||||||
->with('core_apps');
|
->with('core_apps');
|
||||||
|
$this->groupManager->expects($this->once())
|
||||||
|
->method('search')
|
||||||
|
->with($this->equalTo(''), $this->equalTo(5))
|
||||||
|
->willReturn([
|
||||||
|
$this->createMock(IGroup::class),
|
||||||
|
$this->createMock(IGroup::class),
|
||||||
|
]);
|
||||||
|
|
||||||
$this->initialState
|
$this->initialState
|
||||||
->expects($this->exactly(3))
|
->expects($this->exactly(4))
|
||||||
->method('provideInitialState');
|
->method('provideInitialState');
|
||||||
|
|
||||||
$policy = new ContentSecurityPolicy();
|
$policy = new ContentSecurityPolicy();
|
||||||
|
|
@ -201,9 +213,16 @@ class AppSettingsControllerTest extends TestCase {
|
||||||
->expects($this->once())
|
->expects($this->once())
|
||||||
->method('setActiveEntry')
|
->method('setActiveEntry')
|
||||||
->with('core_apps');
|
->with('core_apps');
|
||||||
|
$this->groupManager->expects($this->once())
|
||||||
|
->method('search')
|
||||||
|
->with($this->equalTo(''), $this->equalTo(5))
|
||||||
|
->willReturn([
|
||||||
|
$this->createMock(IGroup::class),
|
||||||
|
$this->createMock(IGroup::class),
|
||||||
|
]);
|
||||||
|
|
||||||
$this->initialState
|
$this->initialState
|
||||||
->expects($this->exactly(3))
|
->expects($this->exactly(4))
|
||||||
->method('provideInitialState');
|
->method('provideInitialState');
|
||||||
|
|
||||||
$policy = new ContentSecurityPolicy();
|
$policy = new ContentSecurityPolicy();
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,34 @@ describe('Settings: App management', { testIsolation: true }, () => {
|
||||||
cy.get('#app-sidebar-vue').contains(/Version \d+\.\d+\.\d+/).should('be.visible')
|
cy.get('#app-sidebar-vue').contains(/Version \d+\.\d+\.\d+/).should('be.visible')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('Limit app usage to group', () => {
|
||||||
|
// When I open the "Active apps" section
|
||||||
|
cy.get('#app-category-enabled a')
|
||||||
|
.should('contain', 'Active apps')
|
||||||
|
.click({ force: true })
|
||||||
|
// Then I see that the current section is "Active apps"
|
||||||
|
cy.url().should('match', /settings\/apps\/enabled$/)
|
||||||
|
cy.get('#app-category-enabled').find('.active').should('exist')
|
||||||
|
// Then I select the app
|
||||||
|
cy.get('#apps-list')
|
||||||
|
.should('exist')
|
||||||
|
.contains('tr', 'Dashboard', { timeout: 10000 })
|
||||||
|
.click()
|
||||||
|
// Then I enable "limit app to group"
|
||||||
|
cy.get('[for="groups_enable_dashboard"]').click()
|
||||||
|
// Then I select a group
|
||||||
|
cy.get('#limitToGroups').click()
|
||||||
|
cy.get('ul[role="listbox"]')
|
||||||
|
.find('span')
|
||||||
|
.contains('admin')
|
||||||
|
.click()
|
||||||
|
cy.get('span.name-parts__first')
|
||||||
|
.contains('admin')
|
||||||
|
.should('be.visible')
|
||||||
|
// Then I disable the group limitation
|
||||||
|
cy.get('button[title="Deselect admin"]').click()
|
||||||
|
})
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: Improve testing with app store as external API
|
* TODO: Improve testing with app store as external API
|
||||||
* The following scenarios require the files_antivirus and calendar app
|
* The following scenarios require the files_antivirus and calendar app
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue