summaryrefslogtreecommitdiffstats
path: root/cypress/e2e/settings/apps.cy.ts
blob: c1ef24951a9aad1d0334ec90ab70e59d0f8697be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/**
 * @copyright Copyright (c) 2023 Ferdinand Thiessen <opensource@fthiessen.de>
 *
 * @author Ferdinand Thiessen <opensource@fthiessen.de>
 *
 * @license AGPL-3.0-or-later
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 */

import { User } from '@nextcloud/cypress'
import { handlePasswordConfirmation } from './usersUtils'

const admin = new User('admin', 'admin')

describe('Settings: App management', { testIsolation: true }, () => {
	beforeEach(() => {
		// disable QA if already enabled
		cy.runOccCommand('app:disable -n testing')
		// enable notification if already disabled
		cy.runOccCommand('app:enable -n updatenotification')

		// I am logged in as the admin
		cy.login(admin)
		// I open the Apps management
		cy.visit('/settings/apps/installed')
	})

	it('Can enable an installed app', () => {
		cy.get('#apps-list').should('exist')
			// Wait for the app list to load
			.contains('tr', 'QA testing', { timeout: 10000 })
			.should('exist')
			// I enable the "QA testing" app
			.contains('button', 'Enable')
			.click({ force: true })

		handlePasswordConfirmation(admin.password)

		// Wait until we see the disable button for the app
		cy.get('#apps-list').should('exist')
			.contains('tr', 'QA testing')
			.should('exist')
			// I see the disable button for the app
			.contains('button', 'Disable', { timeout: 10000 })

		// Change to enabled apps view
		cy.get('#app-category-enabled a').click({ force: true })
		cy.url().should('match', /settings\/apps\/enabled$/)
		// I see that the "QA testing" app has been enabled
		cy.get('#apps-list').contains('tr', 'QA testing')
	})

	it('Can disable an installed app', () => {
		cy.get('#apps-list')
			.should('exist')
			// Wait for the app list to load
			.contains('tr', 'Update notification', { timeout: 10000 })
			.should('exist')
			// I disable the "Update notification" app
			.contains('button', 'Disable')
			.click({ force: true })

		handlePasswordConfirmation(admin.password)

		// Wait until we see the disable button for the app
		cy.get('#apps-list').should('exist')
			.contains('tr', 'Update notification')
			.should('exist')
			// I see the enable button for the app
			.contains('button', 'Enable', { timeout: 10000 })

		// Change to disabled apps view
		cy.get('#app-category-disabled a').click({ force: true })
		cy.url().should('match', /settings\/apps\/disabled$/)
		// I see that the "Update notification" app has been disabled
		cy.get('#apps-list').contains('tr', 'Update notification')
	})

	it('Browse enabled apps', () => {
		// 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')
		// I see that there are only enabled apps
		cy.get('#apps-list')
			.should('exist')
			.find('tr button')
			.each(($action) => {
				cy.wrap($action).should('not.contain', 'Enable')
			})
	})

	it('Browse disabled apps', () => {
		// When I open the "Active apps" section
		cy.get('#app-category-disabled a')
			.should('contain', 'Disabled apps')
			.click({ force: true })
		// Then I see that the current section is "Active apps"
		cy.url().should('match', /settings\/apps\/disabled$/)
		cy.get('#app-category-disabled').find('.active').should('exist')
		// I see that there are only disabled apps
		cy.get('#apps-list')
			.should('exist')
			.find('tr button')
			.each(($action) => {
				cy.wrap($action).should('not.contain', 'Disable')
			})
	})

	it('Browse app bundles', () => {
		// When I open the "App bundles" section
		cy.get('#app-category-your-bundles a')
			.should('contain', 'App bundles')
			.click({ force: true })
		// Then I see that the current section is "App bundles"
		cy.url().should('match', /settings\/apps\/app-bundles$/)
		cy.get('#app-category-your-bundles').find('.active').should('exist')
		// I see the app bundles
		cy.get('#apps-list').contains('tr', 'Enterprise bundle')
		cy.get('#apps-list').contains('tr', 'Education Edition')
		// I see that the "Enterprise bundle" is disabled
		cy.get('#apps-list').contains('tr', 'Enterprise bundle').contains('button', 'Download and enable all')
	})

	it('View app details', () => {
		// When I click on the "QA testing" app
		cy.get('#apps-list').contains('a', 'QA testing').click({ force: true })
		// I see that the app details are shown
		cy.get('#app-sidebar-vue')
			.should('be.visible')
			.find('.app-sidebar-header__info')
			.should('contain', 'QA testing')
		cy.get('#app-sidebar-vue').contains('a', 'View in store').should('exist')
		cy.get('#app-sidebar-vue').find('input[type="button"][value="Enable"]').should('be.visible')
		cy.get('#app-sidebar-vue').find('input[type="button"][value="Remove"]').should('be.visible')
		cy.get('#app-sidebar-vue').contains(/Version \d+\.\d+\.\d+/).should('be.visible')
	})

	/*
	 * TODO: Improve testing with app store as external API
	 * The following scenarios require the files_antivirus and calendar app
	 * being present in the app store with support for the current server version
	 * Ideally we would have either a dummy app store endpoint with some test apps
	 * or even an app store instance running somewhere to properly test this.
	 * This is also a requirement to properly test updates of apps
	 */
	// TODO: View app details for app store apps
	// TODO: Install an app from the app store
	// TODO: Show section from app store
})