diff --git a/.gitignore b/.gitignore index 041eaf3fbb..266dbf07c3 100644 --- a/.gitignore +++ b/.gitignore @@ -120,3 +120,6 @@ storybook-static/ # i18n /contentcuration/locale/CSV_FILES/* + +# pyenv +.python-version diff --git a/contentcuration/contentcuration/forms.py b/contentcuration/contentcuration/forms.py index 8a1183eda1..973916431e 100644 --- a/contentcuration/contentcuration/forms.py +++ b/contentcuration/contentcuration/forms.py @@ -203,13 +203,6 @@ class Meta: fields = ("operating_system", "browser", "channel", "description") -class SubmitFeedbackForm(forms.Form, ExtraFormMixin): - feedback = forms.CharField(required=True) - - class Meta: - fields = ("feedback",) - - class DeleteAccountForm(forms.Form, ExtraFormMixin): email = forms.CharField(required=True) diff --git a/contentcuration/contentcuration/frontend/administration/pages/Users/UserDetails.vue b/contentcuration/contentcuration/frontend/administration/pages/Users/UserDetails.vue index e4bc57ca87..3daafcde24 100644 --- a/contentcuration/contentcuration/frontend/administration/pages/Users/UserDetails.vue +++ b/contentcuration/contentcuration/frontend/administration/pages/Users/UserDetails.vue @@ -101,7 +101,7 @@
@@ -115,7 +115,7 @@
@@ -282,6 +282,9 @@ }, methods: { ...mapActions('userAdmin', ['loadUser', 'loadUserDetails']), + channelUrl(channel) { + return window.Urls.channel(channel.id); + }, updateTitleForPage() { this.updateTabTitle(`${this.userFullName} - Users - Administration`); }, diff --git a/contentcuration/contentcuration/frontend/channelEdit/components/ResourcePanel.vue b/contentcuration/contentcuration/frontend/channelEdit/components/ResourcePanel.vue index d48d0b5a1b..28614b8779 100644 --- a/contentcuration/contentcuration/frontend/channelEdit/components/ResourcePanel.vue +++ b/contentcuration/contentcuration/frontend/channelEdit/components/ResourcePanel.vue @@ -35,7 +35,7 @@ - + diff --git a/contentcuration/contentcuration/frontend/channelEdit/views/progress/ProgressModal.vue b/contentcuration/contentcuration/frontend/channelEdit/views/progress/ProgressModal.vue index b12a45b93c..269bf7ed5c 100644 --- a/contentcuration/contentcuration/frontend/channelEdit/views/progress/ProgressModal.vue +++ b/contentcuration/contentcuration/frontend/channelEdit/views/progress/ProgressModal.vue @@ -45,7 +45,7 @@ v-if="progressPercent === 100 || currentTaskError" color="primary" data-test="refresh" - @click="closeOverlay" + @click="cancelTaskAndClose(currentTask)" > {{ doneButtonText || $tr('refreshButton') }} @@ -68,7 +68,11 @@ {{ $tr('cancel') }} - + {{ stopButtonText || $tr('confirmStopButton') }} @@ -164,54 +168,35 @@ ); }, headerText() { - if (this.currentTask) { - if (this.currentTask.task_type === 'duplicate-nodes') { - return this.$tr('copyHeader'); - } else if (this.isPublishing) { - return this.$tr('publishHeader'); - } else if (this.currentTask.task_type === 'move-nodes') { - return this.$tr('moveHeader'); - } else if (this.isSyncing || this.nothingToSync) { - return this.$tr('syncHeader'); - } - } else if (this.nothingToSync) { + if ((this.currentTask && this.isPublishing) || this.currentChannel.publishing) { + return this.$tr('publishHeader'); + } else if (this.syncing || (this.currentTask && this.isSyncing)) { return this.$tr('syncHeader'); } - return this.$tr('publishHeader'); + return ''; }, descriptionText() { - if (this.currentTask) { - if (this.progressPercent >= 100) { - return this.$tr('finishedMessage'); - } else if (this.currentTask.task_type === 'duplicate-nodes') { - return this.$tr('copyDescription'); - } else if (this.isPublishing) { - return this.$tr('publishDescription'); - } else if (this.currentTask.task_type === 'move-nodes') { - return this.$tr('moveDescription'); - } else if (this.isSyncing) { - return this.$tr('syncDescription'); - } - } else if (this.nothingToSync) { + if (this.progressPercent >= 100 || this.nothingToSync) { return this.$tr('finishedMessage'); + } else if ((this.currentTask && this.isPublishing) || this.currentChannel.publishing) { + return this.$tr('publishDescription'); + } else if (this.syncing || (this.currentTask && this.isSyncing)) { + return this.$tr('syncDescription'); } - return this.$tr('publishDescription'); + return ''; }, }, methods: { - ...mapActions('currentChannel', ['stopPublishing']), - closeOverlay() { - this.stopPublishing().then(() => { + ...mapActions('currentChannel', ['stopTask']), + cancelTaskAndClose(task) { + this.stopTask(task).then(() => { window.location.reload(); }); }, - cancelTask() { - this.stopPublishing(); - }, }, $trs: { - copyHeader: 'Importing resources', - copyDescription: 'Import is in progress, please wait...', + // copyHeader: 'Importing resources', + // copyDescription: 'Import is in progress, please wait...', /* eslint-disable kolibri/vue-no-unused-translations */ defaultHeader: 'Updating channel', defaultDescription: 'Update is in progress, please wait...', @@ -219,8 +204,8 @@ defaultErrorText: 'An unexpected error has occurred. Please try again, and if you continue to see this message, please contact support via the Help menu.', finishedMessage: 'Operation complete! Click "Refresh" to update the page.', - moveHeader: 'Moving Content', - moveDescription: 'Move operation is in progress, please wait...', + // moveHeader: 'Moving Content', + // moveDescription: 'Move operation is in progress, please wait...', publishHeader: 'Publishing channel', publishDescription: 'Once publishing is complete, you will receive an email notification and will be able to make further edits to your channel.', diff --git a/contentcuration/contentcuration/frontend/channelEdit/views/progress/__tests__/progressModal.spec.js b/contentcuration/contentcuration/frontend/channelEdit/views/progress/__tests__/progressModal.spec.js index edfdb6ddd7..ae07943e4e 100644 --- a/contentcuration/contentcuration/frontend/channelEdit/views/progress/__tests__/progressModal.spec.js +++ b/contentcuration/contentcuration/frontend/channelEdit/views/progress/__tests__/progressModal.spec.js @@ -68,15 +68,15 @@ describe('progressModal', () => { expect(wrapper.find('[data-test="refresh"]').exists()).toBe(true); }); it('refresh button should reload the page', () => { - const closeOverlay = jest.fn(); + const cancelTaskAndClose = jest.fn(); let wrapper = makeWrapper({ progressPercent() { return 100; }, }); - wrapper.setMethods({ closeOverlay }); + wrapper.setMethods({ cancelTaskAndClose }); wrapper.find('[data-test="refresh"]').trigger('click'); - expect(closeOverlay).toHaveBeenCalled(); + expect(cancelTaskAndClose).toHaveBeenCalled(); }); describe('on cancel task', () => { @@ -96,19 +96,19 @@ describe('progressModal', () => { expect(wrapper.vm.step).toBe(2); }); it('clicking stop button on confirmation window should cancel the task', () => { - const cancelTask = jest.fn(); - wrapper.setMethods({ cancelTask }); + const cancelTaskAndClose = jest.fn(); + wrapper.setMethods({ cancelTaskAndClose }); wrapper.setData({ step: 2 }); wrapper.find('[data-test="confirmstop"]').trigger('click'); - expect(cancelTask).toHaveBeenCalled(); + expect(cancelTaskAndClose).toHaveBeenCalled(); }); it('clicking cancel button on confirmation window should go back to progress window', () => { - const cancelTask = jest.fn(); - wrapper.setMethods({ cancelTask }); + const cancelTaskAndClose = jest.fn(); + wrapper.setMethods({ cancelTaskAndClose }); wrapper.setData({ step: 2 }); wrapper.find('[data-test="cancelstop"]').trigger('click'); expect(wrapper.vm.step).toBe(1); - expect(cancelTask).not.toHaveBeenCalled(); + expect(cancelTaskAndClose).not.toHaveBeenCalled(); }); }); }); diff --git a/contentcuration/contentcuration/frontend/channelEdit/vuex/contentNode/actions.js b/contentcuration/contentcuration/frontend/channelEdit/vuex/contentNode/actions.js index f1c3a9869b..a8d2298884 100644 --- a/contentcuration/contentcuration/frontend/channelEdit/vuex/contentNode/actions.js +++ b/contentcuration/contentcuration/frontend/channelEdit/vuex/contentNode/actions.js @@ -255,7 +255,7 @@ function generateContentNodeData({ if (extra_fields.n) { contentNodeData.extra_fields.n = extra_fields.n; } - if (extra_fields.randomize) { + if (extra_fields.randomize !== undefined) { contentNodeData.extra_fields.randomize = extra_fields.randomize; } } diff --git a/contentcuration/contentcuration/frontend/channelEdit/vuex/currentChannel/actions.js b/contentcuration/contentcuration/frontend/channelEdit/vuex/currentChannel/actions.js index 7c1f2d8163..367d5492f8 100644 --- a/contentcuration/contentcuration/frontend/channelEdit/vuex/currentChannel/actions.js +++ b/contentcuration/contentcuration/frontend/channelEdit/vuex/currentChannel/actions.js @@ -61,13 +61,14 @@ export function publishChannel(context, version_notes) { return Channel.publish(context.state.currentChannelId, version_notes); } -export function stopPublishing(context) { - return Channel.clearPublish(context.state.currentChannelId).then(() => { - const publishTask = context.rootGetters['task/currentTasksForChannel']( - context.state.currentChannelId - ).find(task => task.task_type === 'export-channel'); - return publishTask - ? context.dispatch('task/deleteTask', publishTask, { root: true }) - : Promise.resolve(); - }); +export function stopTask(context, task) { + if (task && task.task_type === 'export-channel') { + return Channel.clearPublish(context.state.currentChannelId).then(() => { + return context.dispatch('task/deleteTask', task, { root: true }); + }); + } else if (task) { + return context.dispatch('task/deleteTask', task, { root: true }); + } else { + Promise.resolve(); + } } diff --git a/contentcuration/contentcuration/frontend/shared/views/MainNavigationDrawer.vue b/contentcuration/contentcuration/frontend/shared/views/MainNavigationDrawer.vue index 2042a6d804..32f4a95ed6 100644 --- a/contentcuration/contentcuration/frontend/shared/views/MainNavigationDrawer.vue +++ b/contentcuration/contentcuration/frontend/shared/views/MainNavigationDrawer.vue @@ -67,16 +67,13 @@ />

- - - - @@ -87,13 +84,11 @@ import { mapActions, mapState } from 'vuex'; import KolibriLogo from './KolibriLogo'; - import FeedbackForm from 'shared/views/errors/FeedbackForm'; export default { name: 'MainNavigationDrawer', components: { KolibriLogo, - FeedbackForm, }, props: { value: { @@ -101,11 +96,6 @@ default: false, }, }, - data() { - return { - showFeedbackDialog: false, - }; - }, computed: { ...mapState({ user: state => state.session.currentUser, @@ -133,10 +123,6 @@ }, methods: { ...mapActions(['logout']), - showFeedbackForm() { - this.showFeedbackDialog = true; - this.drawer = false; - }, trackClick(label) { this.$analytics.trackClick('general', `User dropdown - ${label}`); }, diff --git a/contentcuration/contentcuration/frontend/shared/views/__tests__/feedbackForm.spec.js b/contentcuration/contentcuration/frontend/shared/views/__tests__/feedbackForm.spec.js deleted file mode 100644 index e83d081846..0000000000 --- a/contentcuration/contentcuration/frontend/shared/views/__tests__/feedbackForm.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -import { mount } from '@vue/test-utils'; -import FeedbackForm from '../errors/FeedbackForm'; - -function makeWrapper() { - return mount(FeedbackForm, { - propsData: { - value: true, - }, - - // TODO: remove this once feedback form is working - computed: { - isAdmin() { - return true; - }, - }, - }); -} - -describe('feedbackForm', () => { - let wrapper; - let submitFeedback; - - beforeEach(() => { - wrapper = makeWrapper(); - submitFeedback = jest.fn().mockReturnValue(Promise.resolve()); - wrapper.setMethods({ submitFeedback }); - }); - - it('should fail if one or more of the fields is null', () => { - wrapper.vm.submit(); - expect(submitFeedback).not.toHaveBeenCalled(); - }); - it('should fail if one or more of the fields is an empty string', () => { - wrapper.setData({ - form: { - feedback: ' ', - }, - }); - wrapper.vm.submit(); - expect(submitFeedback).not.toHaveBeenCalled(); - }); - it('should succeed if form is valid', () => { - wrapper.setData({ - form: { - feedback: 'feedback', - }, - }); - wrapper.vm.submit(); - expect(submitFeedback).toHaveBeenCalled(); - }); -}); diff --git a/contentcuration/contentcuration/frontend/shared/views/details/Details.vue b/contentcuration/contentcuration/frontend/shared/views/details/Details.vue index f09974e0ea..8efe1f734e 100644 --- a/contentcuration/contentcuration/frontend/shared/views/details/Details.vue +++ b/contentcuration/contentcuration/frontend/shared/views/details/Details.vue @@ -231,7 +231,7 @@
@@ -382,6 +382,11 @@ return this.sortedTags.map(tag => tag.tag_name).join(', '); }, }, + methods: { + channelUrl(channel) { + return window.Urls.channel(channel.id); + }, + }, $trs: { /* eslint-disable kolibri/vue-no-unused-translations */ sizeHeading: 'Channel size', diff --git a/contentcuration/contentcuration/frontend/shared/views/errors/FeedbackForm.vue b/contentcuration/contentcuration/frontend/shared/views/errors/FeedbackForm.vue deleted file mode 100644 index 9e7027ffb2..0000000000 --- a/contentcuration/contentcuration/frontend/shared/views/errors/FeedbackForm.vue +++ /dev/null @@ -1,150 +0,0 @@ - - - - diff --git a/contentcuration/contentcuration/frontend/shared/vuex/errors/index.js b/contentcuration/contentcuration/frontend/shared/vuex/errors/index.js index 27defac4b4..075243b393 100644 --- a/contentcuration/contentcuration/frontend/shared/vuex/errors/index.js +++ b/contentcuration/contentcuration/frontend/shared/vuex/errors/index.js @@ -1,5 +1,4 @@ import { ErrorTypes } from 'shared/constants'; -import client from 'shared/client'; // If an Axios error results from calling any of these endpoints, // we assume we want to show a "Channel Not Found" page @@ -53,9 +52,6 @@ export default { store.dispatch('clearError'); } }, - submitFeedback(store, feedback) { - return client.post(window.Urls.submit_feedback(), { feedback }); - }, }, mutations: { SET_FULL_PAGE_ERROR(state, error) { diff --git a/contentcuration/contentcuration/tests/viewsets/test_contentnode.py b/contentcuration/contentcuration/tests/viewsets/test_contentnode.py index 42c0705d88..6022183b66 100644 --- a/contentcuration/contentcuration/tests/viewsets/test_contentnode.py +++ b/contentcuration/contentcuration/tests/viewsets/test_contentnode.py @@ -534,8 +534,9 @@ def test_cannot_update_contentnode(self): def test_update_contentnode_extra_fields(self): user = testdata.user() contentnode = models.ContentNode.objects.create(**self.contentnode_db_metadata) - m = 5 + # Update extra_fields.m + m = 5 self.client.force_authenticate(user=user) response = self.client.post( self.sync_url, @@ -547,8 +548,8 @@ def test_update_contentnode_extra_fields(self): models.ContentNode.objects.get(id=contentnode.id).extra_fields["m"], m ) + # Update extra_fields.m n = 10 - response = self.client.post( self.sync_url, [generate_update_event(contentnode.id, CONTENTNODE, {"extra_fields.n": n})], @@ -562,6 +563,24 @@ def test_update_contentnode_extra_fields(self): models.ContentNode.objects.get(id=contentnode.id).extra_fields["n"], n ) + # Update extra_fields.randomize + randomize = True + response = self.client.post( + self.sync_url, + [generate_update_event(contentnode.id, CONTENTNODE, {"extra_fields.randomize": randomize})], + format="json", + ) + self.assertEqual(response.status_code, 200, response.content) + self.assertEqual( + models.ContentNode.objects.get(id=contentnode.id).extra_fields["m"], m + ) + self.assertEqual( + models.ContentNode.objects.get(id=contentnode.id).extra_fields["n"], n + ) + self.assertEqual( + models.ContentNode.objects.get(id=contentnode.id).extra_fields["randomize"], randomize + ) + def test_update_contentnode_tags(self): user = testdata.user() contentnode = models.ContentNode.objects.create(**self.contentnode_db_metadata) diff --git a/contentcuration/contentcuration/urls.py b/contentcuration/contentcuration/urls.py index fbf7783450..5709584625 100644 --- a/contentcuration/contentcuration/urls.py +++ b/contentcuration/contentcuration/urls.py @@ -116,7 +116,6 @@ def get_redirect_url(self, *args, **kwargs): url(r'^api/change_password/$', settings_views.UserPasswordChangeView.as_view(), name='change_password'), url(r'^api/update_user_full_name/$', settings_views.UsernameChangeView.as_view(), name='update_user_full_name'), url(r'^settings/issues', settings_views.IssuesSettingsView.as_view(), name='issues_settings'), - url(r'^settings/feedback', settings_views.SubmitFeedbackView.as_view(), name='submit_feedback'), url(r'^settings/request_storage', settings_views.StorageSettingsView.as_view(), name='request_storage'), url(r'^policies/update', settings_views.PolicyAcceptView.as_view(), name='policy_update'), ] diff --git a/contentcuration/contentcuration/views/internal.py b/contentcuration/contentcuration/views/internal.py index 4242ecb735..bf8fe7947b 100644 --- a/contentcuration/contentcuration/views/internal.py +++ b/contentcuration/contentcuration/views/internal.py @@ -194,8 +194,6 @@ def api_commit_channel(request): obj = Channel.objects.get(pk=channel_id) - # Need to rebuild MPTT tree pointers since we used `disable_mptt_updates` - ContentNode.objects.partial_rebuild(obj.chef_tree.tree_id) # set original_channel_id and source_channel_id to self since chef tree obj.chef_tree.get_descendants(include_self=True).update(original_channel_id=channel_id, source_channel_id=channel_id) @@ -256,6 +254,11 @@ def api_add_nodes_to_tree(request): whose pk is specified in `root_id`. The list `content_data` conatins json dicts obtained from the to_dict serializarion of the ricecooker node class. + NOTE: It's important that calls made to this API proceed through the tree + in a linear fashion, from first to last topic, recursively iterating through + children. This ensures that MPTT updates take the least amount of time + necessary, and removes the need to delay or disable MPTT updates. + Response is of the form ``` { "success": bool, @@ -272,11 +275,10 @@ def api_add_nodes_to_tree(request): parent_id = data['root_id'] node = ContentNode.objects.get(id=parent_id) request.user.can_edit_node(node) - with ContentNode.objects.disable_mptt_updates(): - return Response({ - "success": True, - "root_ids": convert_data_to_nodes(request.user, content_data, parent_id) - }) + return Response({ + "success": True, + "root_ids": convert_data_to_nodes(request.user, content_data, parent_id) + }) except (ContentNode.DoesNotExist, PermissionDenied): return HttpResponseNotFound("No content matching: {}".format(parent_id)) except KeyError: diff --git a/contentcuration/contentcuration/views/settings.py b/contentcuration/contentcuration/views/settings.py index 77e05671d8..0aa1b87591 100644 --- a/contentcuration/contentcuration/views/settings.py +++ b/contentcuration/contentcuration/views/settings.py @@ -29,14 +29,13 @@ from contentcuration.forms import IssueReportForm from contentcuration.forms import PolicyAcceptForm from contentcuration.forms import StorageRequestForm -from contentcuration.forms import SubmitFeedbackForm from contentcuration.forms import UsernameChangeForm from contentcuration.tasks import generateusercsv_task from contentcuration.utils.csv_writer import generate_user_csv_filename -from contentcuration.utils.google_drive import add_row_to_sheet from contentcuration.utils.messages import get_messages from contentcuration.views.base import current_user_for_context from contentcuration.viewsets.channel import SettingsChannelSerializer +# from contentcuration.utils.google_drive import add_row_to_sheet ISSUE_UPDATE_DATE = datetime(2018, 10, 29) @@ -108,22 +107,6 @@ def form_valid(self, form): send_mail(_("Kolibri Studio issue report"), message, ccsettings.DEFAULT_FROM_EMAIL, [ccsettings.HELP_EMAIL, self.request.user.email]) -class SubmitFeedbackView(PostFormMixin, FormView): - form_class = SubmitFeedbackForm - - def form_valid(self, form): - values = [ - "{} {}".format(self.request.user.first_name, self.request.user.last_name), - self.request.user.email, - datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - form.cleaned_data.get('feedback'), - ] - # Write to feedback sheet - # In production: https://docs.google.com/spreadsheets/d/1aPQ9_zMJgNAMf0Oqr26NChzwSEJz6oQHuPCPKmNRFRQ/edit#gid=0 - # Debug mode: https://docs.google.com/spreadsheets/d/1yFcJWQbR6fzvSsSScz2r1MSIqU_gvnI8JKYtI8deQG8/edit#gid=0 - add_row_to_sheet(ccsettings.GOOGLE_FEEDBACK_SHEET, values) - - class DeleteAccountView(PostFormMixin, FormView): form_class = DeleteAccountForm @@ -165,30 +148,31 @@ def form_valid(self, form): # name, email, storage requested, date of request, number of resources, # average resource size, kind of content, licenses, potential public # channels, audience, uploading for, message, time constraint - values = [ - "{} {}".format(self.request.user.first_name, self.request.user.last_name), - self.request.user.email, - form.cleaned_data.get('storage'), - datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - form.cleaned_data.get('resource_count'), - form.cleaned_data.get('resource_size'), - form.cleaned_data.get('kind'), - form.cleaned_data.get('creators'), - form.cleaned_data.get('sample_link'), - form.cleaned_data.get('license'), - form.cleaned_data.get("public"), - form.cleaned_data.get('audience'), - form.cleaned_data.get('location'), - form.cleaned_data.get('import_count'), - form.cleaned_data.get('uploading_for'), - form.cleaned_data.get('organization_type'), - form.cleaned_data.get('message'), - form.cleaned_data.get('time_constraint'), - ] + # values = [ + # "{} {}".format(self.request.user.first_name, self.request.user.last_name), + # self.request.user.email, + # form.cleaned_data.get('storage'), + # datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + # form.cleaned_data.get('resource_count'), + # form.cleaned_data.get('resource_size'), + # form.cleaned_data.get('kind'), + # form.cleaned_data.get('creators'), + # form.cleaned_data.get('sample_link'), + # form.cleaned_data.get('license'), + # form.cleaned_data.get("public"), + # form.cleaned_data.get('audience'), + # form.cleaned_data.get('location'), + # form.cleaned_data.get('import_count'), + # form.cleaned_data.get('uploading_for'), + # form.cleaned_data.get('organization_type'), + # form.cleaned_data.get('message'), + # form.cleaned_data.get('time_constraint'), + # ] # Write to storage request sheet # In production: https://docs.google.com/spreadsheets/d/1uC1nsJPx_5g6pQT6ay0qciUVya0zUFJ8wIwbsTEh60Y/edit#gid=0 # Debug mode: https://docs.google.com/spreadsheets/d/16X6zcFK8FS5t5tFaGpnxbWnWTXP88h4ccpSpPbyLeA8/edit#gid=0 - add_row_to_sheet(ccsettings.GOOGLE_STORAGE_REQUEST_SHEET, values) + # Comment out for now as there is an authentication issue + # add_row_to_sheet(ccsettings.GOOGLE_STORAGE_REQUEST_SHEET, values) channels = [c for c in form.cleaned_data['public'].split(', ') if c] message = render_to_string('settings/storage_request_email.txt', {"data": form.cleaned_data, "user": self.request.user, "channels": channels}) diff --git a/contentcuration/contentcuration/viewsets/contentnode.py b/contentcuration/contentcuration/viewsets/contentnode.py index 70dc6ba66e..037f80845a 100644 --- a/contentcuration/contentcuration/viewsets/contentnode.py +++ b/contentcuration/contentcuration/viewsets/contentnode.py @@ -21,6 +21,7 @@ from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.serializers import ChoiceField +from rest_framework.serializers import BooleanField from rest_framework.serializers import DictField from rest_framework.serializers import IntegerField from rest_framework.serializers import ValidationError @@ -195,6 +196,7 @@ class ExtraFieldsSerializer(JSONFieldDictSerializer): mastery_model = ChoiceField( choices=exercises.MASTERY_MODELS, allow_null=True, required=False ) + randomize = BooleanField() m = IntegerField(allow_null=True, required=False) n = IntegerField(allow_null=True, required=False) diff --git a/integration_testing/features/add-channel-to-starred.feature b/integration_testing/features/add-channel-to-starred.feature new file mode 100755 index 0000000000..854af3cbe3 --- /dev/null +++ b/integration_testing/features/add-channel-to-starred.feature @@ -0,0 +1,32 @@ +Feature: Add channel to *Starred* tab + User needs to be able to mark channels with a star to label them as favorite for easy access + + Background: + Given I am signed in to Studio as a non-admin user + And I am on any of the tabs (*My Channels*, *Starred*, *View only*, or *Content Library*) + And I see a channel that is not starred (empty star) + + Scenario: Add channel to *Starred* tab + When I click the *Star* button for the desired + Then I see channel star is now full + When I click and open the *Starred* tab + Then I see channel is on the list + + Scenario: Remove channel from *Starred* tab + Given I am on *My Channels*, *View only*, or *Public* tabs + And I see a channel that is starred (full star) + When I click the *Star* button for the + Then I see the star is now empty + When I click and open the *Starred* tab + Then I see the list of channels + But I don't see the channel on the list + + Scenario: Remove channel directly from *Starred* tab + Given I am on *Starred* tabs + And I see a channel on the list with a full star + When I click the *Star* button for the + Then I don't see the channel any more + + Examples: + | channel | + | CK-12 | \ No newline at end of file diff --git a/integration_testing/features/cancel-copy.feature b/integration_testing/features/cancel-copy.feature new file mode 100755 index 0000000000..8e96d8a3df --- /dev/null +++ b/integration_testing/features/cancel-copy.feature @@ -0,0 +1,21 @@ +Feature: Cancel copy + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Cancel copy of single resource + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When the copy creation is in-progress + And I click on *Undo* text on the snackbar + Then the operation ceases and the snackbar disappears + And I don't see any copies made on the clipboard + + Scenario: Cancel copy of multiple resources + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When there is a copy creation of multiple selections in progress + And I click on the *Cancel* text on the snackbar + Then the operation ceases and the snackbar disappears + And I don't see any copies made on the clipboard \ No newline at end of file diff --git a/integration_testing/features/cancel-sync.feature b/integration_testing/features/cancel-sync.feature new file mode 100755 index 0000000000..9d2981836d --- /dev/null +++ b/integration_testing/features/cancel-sync.feature @@ -0,0 +1,19 @@ +Feature: Cancel sync + + Background: + Given I have made sync parameter selections + And the sync task is in-progress + + Scenario: Cancel sync + When I click the *Stop sync* button + Then I see a warning dialog appear + When I press *Yes, stop task* button + Then the sync task stops + And I see a snackbar confirmation for task stopped + And I am back in the channel editor + + Scenario: Finish the sync operation + When the sync progress bar finishes + Then the progress dialog disappears + And I am back in the channel editor page + And a snackbar appears to confirm the sync completion \ No newline at end of file diff --git a/integration_testing/features/copy-resource-via-right-click.feature b/integration_testing/features/copy-resource-via-right-click.feature new file mode 100755 index 0000000000..4ee887e1c0 --- /dev/null +++ b/integration_testing/features/copy-resource-via-right-click.feature @@ -0,0 +1,16 @@ +Feature: Copy resource via right click + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Copy resource via right click + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I right click a topic or a resource + And I click *Make a copy* in the dropdown menu that appears + Then I see a *Creating copy* snackbar appears to confirm the copy is in progress + When the copy creation is finished + Then the *Creating copy* snackbar disappears + And I see another snackbar appears to confirm *Copy created* + And I see the newly made copy appearss in the clipboard below the original \ No newline at end of file diff --git a/integration_testing/features/copy-resource-via-selection-bar.feature b/integration_testing/features/copy-resource-via-selection-bar.feature new file mode 100755 index 0000000000..566a65c75b --- /dev/null +++ b/integration_testing/features/copy-resource-via-selection-bar.feature @@ -0,0 +1,17 @@ +Feature: Copy resource via selection bar + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Copy resource via selection bar + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I select a topic or resource via its checkbox + And I see that the top bar changes to an actions bar + And I click copy icon in the actions bar + Then I see a *Copying* loader appears to confirm the copy in progress + When the copy creation is finished + Then the *Copying* loader disappears + And I see another snackbar appears to confirm *Copy created* + And I see the newly made copy appears in the clipboard below the original \ No newline at end of file diff --git a/integration_testing/features/copy-to-clipboard.feature b/integration_testing/features/copy-to-clipboard.feature new file mode 100755 index 0000000000..0c76c0198c --- /dev/null +++ b/integration_testing/features/copy-to-clipboard.feature @@ -0,0 +1,66 @@ +Feature: Copy to clipboard + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the editor page + And I have edit permissions for + + Scenario: Copy a topic to clipboard from *···* (more options) + When I hover over a topic + And I click on a *···* button for more options + Then I can see the *Copy to clipboard* option + When I select the *Copy to clipboard* option + Then I can see the snackbar notification + And I see the *Undo* button + When I click the *Undo* button + Then I don't see the snackbar notification any more + And I don't see the topic in the clipboard + + Scenario: Copy a resource to clipboard from *···* (more options) + When I hover over a resource + And I click on a *···* button for more options + Then I can see the *Copy to clipboard* option + When I select the *Copy to clipboard* option + Then I can see the snackbar notification + And I see the *Undo* button + When I click the *Undo* button + Then I don't see the snackbar notification any more + And I don't see the resource in the clipboard + + Scenario: Copy a topic to clipboard from toolbar + When I check the topic checkbox + Then I see the toolbar options for topic + When I click the *Copy selected items to clipboard* toolbar button + Then I can see the snackbar notification + And I see the *Undo* button + When I click the *Undo* button + Then I don't see the snackbar notification any more + And I don't see the topic in the clipboard + + Scenario: Copy a resource to clipboard from toolbar + When I check the resource checkbox + Then I see the toolbar options for resource + When I click the *Copy selected items to clipboard* toolbar button + Then I can see the snackbar notification + And I see the *Undo* button + When I click the *Undo* buttons + Then I don't see the snackbar notification any more + And I don't see the resource in the clipboard + + Scenario: Copy multiple resources + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens ups + When I select multiple items via checkboxes + And I see that the select bar has changed to an actions bar + And I click the copy button in the actions bar + Then I see a snackbar appears with a *Creating copies* message + When the copy creation process is finished + Then the *Creating copies* snackbar disappears + And a snackbar *Copies created* appears + And I see that copies are created in my clipboard + + Scenario: Copy multiple topics to clipboard from toolbar + # same as for single resources, just the snackbar notification indicates the number of items to remove + + Examples: + | channel | topic | resource | diff --git a/integration_testing/features/create-a-channel.feature b/integration_testing/features/create-a-channel.feature new file mode 100755 index 0000000000..501cc1c38b --- /dev/null +++ b/integration_testing/features/create-a-channel.feature @@ -0,0 +1,19 @@ +Feature: Create a channel + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the *My Channels* tab + + Scenario: Create a channel + When I click the *New channel* button + Then I see the *New channel* page + When I enter channel name + And I enter channel description + And I select a language + And I upload the image file as a channel thumbnail + And I click the *Create* button + Then I see the channel on *My Channels* list + + Examples: + | channel_name | channel_description | language | + | ck-12 | sample channel | english | diff --git a/integration_testing/features/create-a-topic.feature b/integration_testing/features/create-a-topic.feature new file mode 100755 index 0000000000..089609584d --- /dev/null +++ b/integration_testing/features/create-a-topic.feature @@ -0,0 +1,14 @@ +Feature: Create a topic + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the directory selection screen + And I find a destination I want to move content into + + Scenario: Create a topic + When I click *New topic* button in the top right corner + Then a modal appears prompting a new topic title + When I name give the topic a title + And I click *Create* + Then the new topic appears in that node directory + And a snackbar appears confirming the new topic creation \ No newline at end of file diff --git a/integration_testing/features/create-account.feature b/integration_testing/features/create-account.feature new file mode 100755 index 0000000000..e4d4c4eba8 --- /dev/null +++ b/integration_testing/features/create-account.feature @@ -0,0 +1,30 @@ +Feature: Create account on Studio + + Background: + Given I am signed in to Studio as a non-admin user + And I am on Studio home page + And I do not have an account registered with my + + Scenario: Create account + When I input all the required fields + And I click the *Finish* button + Then I see the *Activation link sent* page + And I see the email in my Inbox + When I click the activation link + And I go to Studio home page + Then I am able to sign in + + Scenario: See error notification + When I fail to provide all the required information + Then I see the *Please fix the errors below* alert under the main heading + And I see the *Field is required* error notification for each missing information + When I correct the error(s) + And I click the *Finish* button + Then I see the *Activation link sent* page + And I see the email in my Inbox + When I click the activation link + And I go to Studio home page + Then I am able to sign in + + Examples: + | email | \ No newline at end of file diff --git a/integration_testing/features/delete-account.feature b/integration_testing/features/delete-account.feature new file mode 100755 index 0000000000..cc0c392062 --- /dev/null +++ b/integration_testing/features/delete-account.feature @@ -0,0 +1,20 @@ +Feature: Delete account + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the *Settings > Account* page + + Scenario: Delete account without active channels + When I click the red *Delete account* button + Then I see a modal appears that prompts my email to continue + When I enter my email into the text field + And click the *Delete account* button + Then a snackbar confirmation appears that my account is deleted + And I am signed out of Kolibri Studio + And I receive an email confirmation that my account is deleted + + Scenario: Delete account with active channels + Given my account still has active channels for which I am an admin + When I look under the *Delete account* heading + Then I don't see the *Delete account* button + And I need to delete my active channels or invite other admins in order to see the *Delete account* button \ No newline at end of file diff --git a/integration_testing/features/delete-resources.feature b/integration_testing/features/delete-resources.feature new file mode 100755 index 0000000000..25fd2d287a --- /dev/null +++ b/integration_testing/features/delete-resources.feature @@ -0,0 +1,27 @@ +Feature: Delete resources permanently + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor page + And I have one removed resource from my channel editor tree + + Scenario: Delete a single resource permanently + When I click the *Trash* button in the top appbar + Then I see one resource removed from my channel + When I select that resource + And I click *Delete* in the bottom bar + Then I see a warning message appear + When I click the *Delete permanently* button + Then the selection disappear from the list + And a snackbar appears to confirm the deletion + And I see an empty state message + + Scenario: Delete multiple resources permanently + When I click the *Trash* button in the top appbar + Then I see a list of resources removed from my channel + When I select multiple resources from the list + And I click *Delete* in the bottom bar + Then I see a warning message appear + When I click the *Delete permanently* button + Then the selections disappear from the list + And a snackbar appears to confirm the deletion of multiple resources \ No newline at end of file diff --git a/integration_testing/features/deploy-channel.feature b/integration_testing/features/deploy-channel.feature new file mode 100755 index 0000000000..fe2445616e --- /dev/null +++ b/integration_testing/features/deploy-channel.feature @@ -0,0 +1,15 @@ +Feature: Deploy Channel + + Background: + Given I am signed in to Studio as + And I have uploaded content to the staging tree for + + Scenario: Deploy Channel + When I go to the URL https://api.studio.learningequality.org/channels//staging + And I click the *Deploy Channel* button at the top right + Then I see the deploy channel confirmation box + When I click the *Deploy* button + Then I get redirected to https://api.studio.learningequality.org/channels//edit/ + + Examples: + | username | channel_id | \ No newline at end of file diff --git a/integration_testing/features/drag-drop-out-of-clipboard.feature b/integration_testing/features/drag-drop-out-of-clipboard.feature new file mode 100755 index 0000000000..e21bcbc813 --- /dev/null +++ b/integration_testing/features/drag-drop-out-of-clipboard.feature @@ -0,0 +1,14 @@ +Feature: Drag-drop resources out of the clipboard + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Drag-drop content nodes out of the clipboard + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I begin to drag items out of the clipboard + And I drop the items on the channel editor + Then clipboard stays open + And the items disappear from the clipboard + And I see the items appear on the channel editor node at the very bottom \ No newline at end of file diff --git a/integration_testing/features/drag-drop-to-clipboard.feature b/integration_testing/features/drag-drop-to-clipboard.feature new file mode 100755 index 0000000000..1c6474a2dc --- /dev/null +++ b/integration_testing/features/drag-drop-to-clipboard.feature @@ -0,0 +1,23 @@ +Feature: Drag-drop to clipboard + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Drag-drop resources to an open clipboard + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When the clipboard is open + And I begin to drag resources from the channel editor into the open clipboard + Then I see the clipboard shows a thick border and turns opaque to indicate this is a draggable area + When I drop the resource into the clipboard + Then the opaque area disappears + And I see the clipboard updated to reflect the newly dragged resources + + Scenario: Drag-drop resources to the clipboard button + When the clipboard is closed and the interface shows the clipboard button + And I begin to drag resources from the channel editor toward the clipboard button + Then I see the clipboard button changes color styling and move slightly up and down + When I drop the content into the clipboard button + Then the clipboard button styling gets back to normal + And I see a snackbar appears to confirm the resources were moved to clipboard \ No newline at end of file diff --git a/integration_testing/features/edit-account-information.feature b/integration_testing/features/edit-account-information.feature new file mode 100755 index 0000000000..ec1f68e432 --- /dev/null +++ b/integration_testing/features/edit-account-information.feature @@ -0,0 +1,23 @@ +Feature: Edit account information + + Background: + Given I am signed in to Studio as a non-admin user + And I am on Studio *Settings > Account* page + + Scenario: Changing password + When I click on the *Change password* hyperlink + And I make changes to my password + And I press *Save changes* button in the modal + Then I see a snackbar appears to confirm my password was updated + And the modal is dismissed + + Scenario: Editing full name + When I click the *Edit* hyperlink near my username + And I make changes to my full name + And I click *Save changes* button in the modal + Then I see a snackbar appears to confirm changes are saved + And the modal is dismissed + + Scenario: Copying API token + When I click the copy button in the token text field + Then a snackbar appears to confirm the code is copied \ No newline at end of file diff --git a/integration_testing/features/expand-and-collapse-clipboard-topics.feature b/integration_testing/features/expand-and-collapse-clipboard-topics.feature new file mode 100755 index 0000000000..5f4455da73 --- /dev/null +++ b/integration_testing/features/expand-and-collapse-clipboard-topics.feature @@ -0,0 +1,15 @@ +Feature: Expand and collapse topics in the clipboard + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Expand and collapse topics in the clipboard + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I expand a topic on the clipboard via the downward carot button + Then I see the items within the topic appear + And I see the downward carot button changes to an upward carot button + When I collapse a topic on the clipboard via the upward carot button + Then I see the items within that topic disappear + And I see the upward carot button changes to an upward carot button \ No newline at end of file diff --git a/integration_testing/features/export-account-information.feature b/integration_testing/features/export-account-information.feature new file mode 100755 index 0000000000..33d719f03b --- /dev/null +++ b/integration_testing/features/export-account-information.feature @@ -0,0 +1,17 @@ +Feature: Export account information + + Background: + Given I have a Studio account + And I am signed in to Studio as a non-admin user + And I have interacted with various data and channels + And I am on the *Settings > Account* page + + Scenario: Export account data + When I click the *Export Data* button + Then I see a modal appears to confirm export is in-progress + When I click *Ok* to dismiss the modal + Then I see the modal disappears + + Scenario: Viewing the exported data + When I check the Inbox of my email account registered at Studio + Then I see an email with an attachment that contains my account data \ No newline at end of file diff --git a/integration_testing/features/get-channel-token-after-publishing.feature b/integration_testing/features/get-channel-token-after-publishing.feature new file mode 100755 index 0000000000..1667acd2e2 --- /dev/null +++ b/integration_testing/features/get-channel-token-after-publishing.feature @@ -0,0 +1,16 @@ +Feature: Get channel token after publishing the channel + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the editor page + And the has recently been published + + Scenario: Get channel token after publishing the channel + When I click on the ellipsis button in the top right corner + And I click on the *Get token* menu option + Then I see a modal appears with an option to copy the channel token + When I click on the copy button + Then a snackbar appears to confirm the code is copied to the clipboard + + Examples: + | channel | \ No newline at end of file diff --git a/integration_testing/features/go-back-from-review-import-selections-to-channel-list.feature b/integration_testing/features/go-back-from-review-import-selections-to-channel-list.feature new file mode 100755 index 0000000000..60cfd3c606 --- /dev/null +++ b/integration_testing/features/go-back-from-review-import-selections-to-channel-list.feature @@ -0,0 +1,19 @@ +Feature: Go back from Review selections for import to channel list + + Background: + Given I am signed in to Studio as a non-admin user + And I am on *My Channels > edit* page + + Scenario: Go back from Review selections for import to channel list + When I click the *Add* button + And I select the *Import from Channels* option + Then I see the *Import from Other Channels* page + When I select a from the public channels + And I click the *Review* button + Then I see the *Review selections for import* modal + When I click the *Back* link + Then I see *Import from Other Channels* page again + And I see the *0 topics, 0 resource* at the bottom of the modal + + Examples: + | resource | \ No newline at end of file diff --git a/integration_testing/features/go-to-resource-original-location.feature b/integration_testing/features/go-to-resource-original-location.feature new file mode 100755 index 0000000000..02f98784a8 --- /dev/null +++ b/integration_testing/features/go-to-resource-original-location.feature @@ -0,0 +1,12 @@ +Feature: Go to resource original location + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Go to resource original location + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I right click a topic or resource in the clipboard + And I click *Go to original location* + Then a new tab opens and navigates me to the channel and node location in question that I pulled that topic or resource from \ No newline at end of file diff --git a/integration_testing/features/import-content-from-another-channel.feature b/integration_testing/features/import-content-from-another-channel.feature new file mode 100755 index 0000000000..1e8b437d43 --- /dev/null +++ b/integration_testing/features/import-content-from-another-channel.feature @@ -0,0 +1,25 @@ +Feature: Import content from another channel + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the editing page + + Scenario: Import content from another channel + When I click the *Add* button + And I select the *Import from Channels* option + Then I see the *Import from Other Channels* page + And I see a list of channels that I have access to + When I expand which I have access to + And select some content under + And press *Review* button + Then I see the review screen + When I finish reviewing my selections + And I press *Import* button + Then I see the *Copying content* modal which displays the import progress + And I don't see the *Import from Other channels* page + And I see the editing page again + +#Import content from an available/accessible channel + + Examples: + | channel | \ No newline at end of file diff --git a/integration_testing/features/import-from-search-results-at-my-channels-channel-2.feature b/integration_testing/features/import-from-search-results-at-my-channels-channel-2.feature new file mode 100755 index 0000000000..0636f6c151 --- /dev/null +++ b/integration_testing/features/import-from-search-results-at-my-channels-channel-2.feature @@ -0,0 +1,21 @@ +Feature: Import content from the search results at *My Channels* + + Background: + Given I am already a registered user + And I am signed in to Studio as a non-admin user + And I am on *My Channels > edit* page + + Scenario: Import content from the search results at *My Channels* + When I click the *Add* button + And I select the *Import from Channels* option + Then I see the *Import from Other Channels* modal + When I select a and a from the public channels + And I click the *Review* button + Then I see the *Review selections for import* page + When I click the arrow button to open the topic tree for + Then I see all the resources of the topic + When I click the *Import* button + Then I see *Copying Content* modal + + Examples: + | channel | topic | resource | \ No newline at end of file diff --git a/integration_testing/features/import-from-search-results-at-my-channels-channel.feature b/integration_testing/features/import-from-search-results-at-my-channels-channel.feature new file mode 100755 index 0000000000..0fdda833e7 --- /dev/null +++ b/integration_testing/features/import-from-search-results-at-my-channels-channel.feature @@ -0,0 +1,24 @@ +Feature: Import content from the search results + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the editing page + + Scenario: Import content from the search results + When I click the *Add* button + And I select the *Import from Channels* option + Then I see the *Import from Other Channels* page + When I enter the in the search bar + And I click the *Search* button + Then I see all the search results for my + When I select a from the results + And I click the *Review* button + Then I see the *Review selections for import* modal + When I click the *Import* button + Then I see *Copying Content* modal + And I see the *Operation is complete!...* notification + When I click the *Refresh* button + Then I see the imported in the + + Examples: + | channel | search_term | resource | \ No newline at end of file diff --git a/integration_testing/features/jump-to-new-location.feature b/integration_testing/features/jump-to-new-location.feature new file mode 100755 index 0000000000..98bd5bf3d8 --- /dev/null +++ b/integration_testing/features/jump-to-new-location.feature @@ -0,0 +1,11 @@ +Feature: Jump to the new location + + Background: + Given Moving selections into a new directory has finished + And I am on the channel edit page + And a snackbar appeared to confirm the move was successful + And there is a *Go to location* action text on the snackbar + + Scenario: Jump to the new location + When I click the *Go to location* action + Then I jump to the new location the resources are moved to \ No newline at end of file diff --git a/integration_testing/features/manage-additional-channel-options.feature b/integration_testing/features/manage-additional-channel-options.feature new file mode 100755 index 0000000000..1df6615755 --- /dev/null +++ b/integration_testing/features/manage-additional-channel-options.feature @@ -0,0 +1,14 @@ +Feature: Access and use additional options on channel list + User needs to be able to access additional options to manage channels from the channel list + + Background: + Given I am signed in to Studio as a non-admin user + And I am on any of the tabs (*My Channels*, *Starred*, *View only*, or *Content Library*) + + Scenario: Edit channel details + When I click the *⋮* button (ellipsis button) for more options + And I select *Edit channel details* + Then I + And I + When I + Then I \ No newline at end of file diff --git a/integration_testing/features/move-resources-from-clipboard.feature b/integration_testing/features/move-resources-from-clipboard.feature new file mode 100755 index 0000000000..33eca3e2c4 --- /dev/null +++ b/integration_testing/features/move-resources-from-clipboard.feature @@ -0,0 +1,13 @@ +Feature: Move multiple resources from Clipboard + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Move multiple resources + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I select multiple items via checkboxes + And I see that the select bar changes to an actions bar + And I click the move button in the actions bar + Then I am redirected to the movement interface where I can choose a new directory or channel to move the items to \ No newline at end of file diff --git a/integration_testing/features/move-resources.feature b/integration_testing/features/move-resources.feature new file mode 100755 index 0000000000..df3d6d3705 --- /dev/null +++ b/integration_testing/features/move-resources.feature @@ -0,0 +1,16 @@ +Feature: Move resources to a new destination + + Background: + Given I am signed in to Studio as a non-admin user + And I select some resources on the channel editor + Then I see a move button appears in the actions bar + + Scenario: Move resources into a new destination + When I click on a checkbox(s) and make a resource selection + And I click the move button + Then I am navigated to a screen that allows me to navigate and choose a destination to move the resource + When I navigate to an appropriate destination + And click the *Move here* button + Then I am redirected to the channel editor + And I see a snackbar confirmation that my resources are moved + And the resources are no longer in my original directory \ No newline at end of file diff --git a/integration_testing/features/move-to-clipboard-via-right-click.feature b/integration_testing/features/move-to-clipboard-via-right-click.feature new file mode 100755 index 0000000000..dc7a85a2b2 --- /dev/null +++ b/integration_testing/features/move-to-clipboard-via-right-click.feature @@ -0,0 +1,12 @@ +Feature: Move resource in the clipboard via right click + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Move an item in the clipboard via right click + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I right click a topic or resource in the clipboard + And click *Move to...* in the dropdown menu that appears + Then I am redirected to the movement interface where I can choose a new directory or channel to move the items to \ No newline at end of file diff --git a/integration_testing/features/open-a-channel-in-a-new-tab.feature b/integration_testing/features/open-a-channel-in-a-new-tab.feature new file mode 100755 index 0000000000..aecf2dbd73 --- /dev/null +++ b/integration_testing/features/open-a-channel-in-a-new-tab.feature @@ -0,0 +1,12 @@ +Feature: Open channel in new tab + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Open channel in new tab + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I right click a channel item on the clipboard + And click *Open in new tab* on the dropdown menu that appears + Then a tab opens with the view-only or editable channel in question \ No newline at end of file diff --git a/integration_testing/features/open-sidebar-and-user-menus.feature b/integration_testing/features/open-sidebar-and-user-menus.feature new file mode 100755 index 0000000000..b515e28819 --- /dev/null +++ b/integration_testing/features/open-sidebar-and-user-menus.feature @@ -0,0 +1,20 @@ +Feature: Open and close sidebar and user menus +User needs to be able to open and close the sidebar menu and the user menu + + Background: + Given I am signed in to Studio as a non-admin user + And I am on any of the tabs (*My Channels*, *Starred*, *View only*, *Content Library*, or *Collections*) + + Scenario: Open and close the sidebar menu + When I click the hamburger menu button in the upper left screen corner + Then I see the sidebar menu + And I can select any of the options inside + When I click the *X* button, or anywhere on the browser screen + Then I don't see the sidebar menu anymore + + Scenario: Open and close the user menu + When I click the user menu button in the upper right screen corner + Then I see the user menu + And I can select any of the options inside + When I click the user menu button again, or anywhere on the browser screen + Then I don't see the user menu anymore \ No newline at end of file diff --git a/integration_testing/features/preview-resource-in-clipboard.feature b/integration_testing/features/preview-resource-in-clipboard.feature new file mode 100755 index 0000000000..25c4021999 --- /dev/null +++ b/integration_testing/features/preview-resource-in-clipboard.feature @@ -0,0 +1,11 @@ +Feature: Preview resource in the clipboard + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Preview resource in the clipboard + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I click on a topic title or resource title + Then I see the clipboard content transition to the preview panel \ No newline at end of file diff --git a/integration_testing/features/publish-channel.feature b/integration_testing/features/publish-channel.feature new file mode 100755 index 0000000000..731d34692b --- /dev/null +++ b/integration_testing/features/publish-channel.feature @@ -0,0 +1,19 @@ +Feature: Publish a channel + + Background: + Given I am signed in to Studio as a non-admin user + And I am in the channel editor page + And I have write access to the channel + And the channel has had modifications + + Scenario: Publish a channel + When I click the *Publish* button in the top right corner + Then the *Publish modal* appears + And I see steps for resolving errors and describing new changes + When I click *Publish* + Then I see the *Publishing channel* progress bar appears + When the progress bar reaches 100% + And I click *Refresh* + Then the browser refreshes + And the published version is updated + And I receive an email for channel published successfully \ No newline at end of file diff --git a/integration_testing/features/remove-from-clipboard-via-right-click.feature b/integration_testing/features/remove-from-clipboard-via-right-click.feature new file mode 100755 index 0000000000..3db40cf0d4 --- /dev/null +++ b/integration_testing/features/remove-from-clipboard-via-right-click.feature @@ -0,0 +1,13 @@ +Feature: Remove resource from the clipboard via right click + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Remove resource from the clipboard via right click + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I right click a topic or a resource + And I click *Delete* in the dropdown menu that appears + Then the dropdown menu disappears + And I see that the resource in question is removed from the clipboard \ No newline at end of file diff --git a/integration_testing/features/remove-from-clipboard-via-selection-bar.feature b/integration_testing/features/remove-from-clipboard-via-selection-bar.feature new file mode 100755 index 0000000000..4f6e53d284 --- /dev/null +++ b/integration_testing/features/remove-from-clipboard-via-selection-bar.feature @@ -0,0 +1,14 @@ +Feature: Remove resource from the clipboard via selection bar + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Remove resource from the clipboard via selection bar + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I select a topic or resource via its checkbox + And I see that the top bar changes to an actions bar + And I click the *Delete* button in the actions bar + Then I see that the resource in question disappears from the clipboard + And I see a snackbar appears to confirm the resource is removed \ No newline at end of file diff --git a/integration_testing/features/remove-multiple-resources-from-the-clipboard.feature b/integration_testing/features/remove-multiple-resources-from-the-clipboard.feature new file mode 100755 index 0000000000..f6c423898f --- /dev/null +++ b/integration_testing/features/remove-multiple-resources-from-the-clipboard.feature @@ -0,0 +1,13 @@ +Feature: Remove multiple resources from the clipboard + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Remove multiple resources from the clipboard + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I select multiple resource checkboxes + And I click the remove button in the actions bar + Then I see all my resources removed from the clipboard + And I see a snackbar confirming that the resources were removed \ No newline at end of file diff --git a/integration_testing/features/remove-resource-from-channel.feature b/integration_testing/features/remove-resource-from-channel.feature new file mode 100755 index 0000000000..ec1d985e52 --- /dev/null +++ b/integration_testing/features/remove-resource-from-channel.feature @@ -0,0 +1,54 @@ +Feature: Remove a topic or a resource from a channel + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the editor page + And I have edit permissions for + + Scenario: Remove a topic from *···* (more options) + When I hover over a topic + And I click on a *···* button for more options + Then I can see the *Remove* option + When I select the *Remove* option + Then I can see the *Sent to trash* snackbar notification + And I see the *Undo* button + And I don't see the topic anymore + When I click the *Undo* button + Then I can see the topic again + + Scenario: Remove a resource from *···* (more options) + When I hover over a resource + And I click on a *···* button for more options + Then I can see the *Remove* option + When I select the *Remove* option + Then I can see the *Sent to trash* snackbar notification + And I see the *Undo* button + And I don't see the resource anymore + When I click the *Undo* button + Then I can see the resource again + + Scenario: Remove a topic from toolbar + When I check the topic checkbox + Then I see the toolbar options for topic + When I click the *Delete selected items* button + Then I can see the *Sent to trash* snackbar notification + And I see the *Undo* button + And I don't see the topic anymore + When I click the *Undo* button + Then I can see the topic again + + Scenario: Remove a resource from toolbar + When I hover over a resource checkbox + Then I see the toolbar options for resource + When I click the *Delete selected items* button + Then I can see the *Sent to trash* snackbar notification + And I see the *Undo* button + And I don't see the resource anymore + When I click the *Undo* button + Then I can see the resource again + + Scenario: Remove multiple topics or resources + # same as for single resources, just the snackbar notification indicates the number of items to remove + + Examples: + | channel | topic | resource | \ No newline at end of file diff --git a/integration_testing/features/report-issue.feature b/integration_testing/features/report-issue.feature new file mode 100755 index 0000000000..6e0cdf987d --- /dev/null +++ b/integration_testing/features/report-issue.feature @@ -0,0 +1,23 @@ +Feature: Report an issue + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the *Settings > About Studio* page + + Scenario: Report an issue + When I click the *Report an issue* button + Then I see a dialog modal appears + And I see text input fields + When I input issue information + And click the *Submit* button + Then I see the modal disappears + And a snackbar appears to confirm the submission + + Scenario: Error in issue report submission + When I input some issue information + And skip at least one field + Then I see error validation text beneath the error fields + When I resolve those errors + And click the *Submit* button + Then I see the modal disappears + And a snackbar appears to confirm the submission \ No newline at end of file diff --git a/integration_testing/features/request-more-storage-space.feature b/integration_testing/features/request-more-storage-space.feature new file mode 100755 index 0000000000..ec280338f8 --- /dev/null +++ b/integration_testing/features/request-more-storage-space.feature @@ -0,0 +1,19 @@ +Feature: Request more storage space + + Background: + Given I am signed in to Studio as a non-admin user + And I am on Studio *Settings > Storage* page + And I click *Show form* on the page + + Scenario: Submit more space request + When I fill in all the space request text fields + And I click the *Send request* submit button + Then I see all the text fields clear + And a snackbar appears to confirm the submission + + Scenario: Submit more space request with errors + When I do not fill in all the required text fields + And I click the *Send request* submit button + Then I see a system error message above the form + And I see my text field inputs still intact + And I see error validation text near fields that need input \ No newline at end of file diff --git a/integration_testing/features/resource-count-updates-properly.feature b/integration_testing/features/resource-count-updates-properly.feature new file mode 100755 index 0000000000..deb5fd9551 --- /dev/null +++ b/integration_testing/features/resource-count-updates-properly.feature @@ -0,0 +1,19 @@ +Feature: Resource count gets updated properly + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the editing page + + Scenario: Resource count gets updated properly + When I click the *Add* button + And I select the *Import from Channels* option + Then I see the *Import from Other Channels* page + When I select the from + Then I see the *N topics, '' resources* notification at the bottom + When I select a single + Then I see the *N topics, '+1' resources* notification at the bottom + When I deselect the + Then I see the *0 topics, 1 resource* notification at the bottom of the page + + Examples: + | channel | topic | import_channel | resource | \ No newline at end of file diff --git a/integration_testing/features/restore-resources-from-trash.feature b/integration_testing/features/restore-resources-from-trash.feature new file mode 100755 index 0000000000..96a8597b46 --- /dev/null +++ b/integration_testing/features/restore-resources-from-trash.feature @@ -0,0 +1,52 @@ +Feature: Restore resources from trash + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the editing page + + Scenario: Restore a single resource from trash to a channel + When I click the *Trash* button + Then I see the *Managing deleted content* modal + And I see all the deleted resources in the modal + When I select the resource + Then I see the *Restore Selected* button is active + When I click the *Restore Selected* button + Then I see the *Moving Content* modal + When I select the channel as a restore destination + And I click the *Move* button + Then I see the *Moving 1 resource to * notification + When I click the arrow button to open the topic tree + And I select the topic + Then I see the *Moving 1 resource to * notification + When I click *Move* button again + Then I see the *Managing deleted content* modal again + When I click the *Close* button + And I open the topic + And I reload the page + #not sure if this is a bug or a feature, but I had to do it + Then I see the resource restored to the inside the + + Scenario: Restore multiple resources from trash to a channel + When I click the *Trash* button + Then I see the *Managing deleted content* modal + And I see all the deleted resources in the modal + When I select the resource + Then I see the *Restore Selected* button is active + When I click the *Restore Selected* button + Then I see the *Moving Content* modal + When I select the channel as a restore destination + And I click the *Move* button + Then I see the *Moving resources to * notification + When I click the arrow button to open the topic tree + And I select the topic + Then I see the *Moving resources to * notification + When I click *Move* button again + Then I see the *Managing deleted content* modal again + When I click the *Close* button + And I open the topic + And I reload the page + #not sure if this is a bug or a feature, but I had to do it + Then I see the resource restored to the inside the + + Examples: + | channel | resource | number | topic | \ No newline at end of file diff --git a/integration_testing/features/review-import-selection-at-my-channels.feature b/integration_testing/features/review-import-selection-at-my-channels.feature new file mode 100755 index 0000000000..f7793d7c5d --- /dev/null +++ b/integration_testing/features/review-import-selection-at-my-channels.feature @@ -0,0 +1,17 @@ +Feature: Review import selection at *My Channels* + + Background: + Given I am signed in to Studio as a non-admin user + And I am on *My Channels > edit* page + + Scenario: Review import selection at *My Channels* + Given I click the *Add* button + Then I see *Import from Channels* button + When I click the *Import from Channels* button + Then I see the *Import from Other Channels* page + When I select contents + And I click *Review* button + Then I see the list of contents I selected + + Examples: + | channel | \ No newline at end of file diff --git a/integration_testing/features/review-used-storage.feature b/integration_testing/features/review-used-storage.feature new file mode 100755 index 0000000000..dbc9233bd9 --- /dev/null +++ b/integration_testing/features/review-used-storage.feature @@ -0,0 +1,15 @@ +Feature: Review used storage + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the *Settings > Storage* page + + Scenario: Review used storage + Given I have uploaded some resources in my channels + When I look under the *% storage used* heading + Then I see the storage use broken down by resources type + + Scenario: No storage used + Given that I have not uploaded any resources in my channels + When I look under the *% storage used* heading + Then I see that there is 0% storage used \ No newline at end of file diff --git a/integration_testing/features/search-for-resources.feature b/integration_testing/features/search-for-resources.feature new file mode 100755 index 0000000000..9f32dc91be --- /dev/null +++ b/integration_testing/features/search-for-resources.feature @@ -0,0 +1,16 @@ +Feature: Search for resources + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the editing page + + Scenario: Search for resources + When I click the *Add* button + And I select the *Import from Channels* option + Then I see the *Import from Other Channels* modal + When I enter the in the search bar + And I click the *Search* button + Then I see all the search results for my + + Examples: + | channel | search_term | \ No newline at end of file diff --git a/integration_testing/features/stop-channel-publish.feature b/integration_testing/features/stop-channel-publish.feature new file mode 100755 index 0000000000..87c35e3b89 --- /dev/null +++ b/integration_testing/features/stop-channel-publish.feature @@ -0,0 +1,11 @@ +Feature: Stop the publish of a channel + + Background: + Given there's a channel publish task in-progress + + Scenario: Stop the publish of a channel + When I click the *Stop* button in the publish modal + Then a confirmation message appears + When I click *Yes, stop task* + Then the publish task stops + And I am back in the channel editor page \ No newline at end of file diff --git a/integration_testing/features/sync-channel.feature b/integration_testing/features/sync-channel.feature new file mode 100755 index 0000000000..a4c3cd8444 --- /dev/null +++ b/integration_testing/features/sync-channel.feature @@ -0,0 +1,15 @@ +Feature: Sync channel + + Background: + Given I am signed in to Studio as a non-admin user + And I am in the channel editor page + When I click on the ellipsis button in the top-right corner + And I click on the *Sync channel* menu option + Then a *Sync resources* modal appears + + Scenario: Sync channel + When I make sync selections via the checkboxes + And click the *Continue* button + Then a modal appears to confirm my sync choices + When I click *Sync* + Then a progress bar appears \ No newline at end of file diff --git a/integration_testing/features/undo-removal-of-clipboard-resources.feature b/integration_testing/features/undo-removal-of-clipboard-resources.feature new file mode 100755 index 0000000000..afefbcc7bf --- /dev/null +++ b/integration_testing/features/undo-removal-of-clipboard-resources.feature @@ -0,0 +1,19 @@ +Feature: Undo the removal of a clipboard resources + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the channel editor view + + Scenario: Undo the removal of a clipboard resource + When I click on clipboard button on the bottom-right of the screen + Then the clipboard opens up + When I have removed a resource from the clipboard + And I see a snackbar confirming the resource is removed + And I click the *Undo* button on the snackbar + Then I see the resource back on the clipboard + + Scenario: Undo removal of multiple resources + When I have removed several resources from the clipboard + And I see the snackbar confirmation that the resources were removed + And I click the *Undo* button on the snackbar + Then I see the resources are back to the clipboard \ No newline at end of file diff --git a/integration_testing/features/url-updates.feature b/integration_testing/features/url-updates.feature new file mode 100755 index 0000000000..13dad1e0f7 --- /dev/null +++ b/integration_testing/features/url-updates.feature @@ -0,0 +1,25 @@ +Feature: URL update when the user switches between channel list +User can see changes at the URL when they switch between channel list + + Background: + Given I am signed in to Studio as a non-admin user + + Scenario: URL update at the *My Channels* nav + When I click *My Channels* nav + Then I see that the URL changes + + Scenario: URL update at the *Starred* nav + When I click *Starred* nav + Then I see that the URL changes + + Scenario: URL update at the *View-Only* nav + When I click *View-Only* nav + Then I see that the URL changes + + Scenario: URL update at the *Content Library* nav + When I click *Content Library* nav + Then I see that the URL changes + + Scenario: URL update at the *Collections* nav + When I click *Collections* nav + Then I see that the URL changes \ No newline at end of file diff --git a/integration_testing/features/use-channels-with-view-only-access.feature b/integration_testing/features/use-channels-with-view-only-access.feature new file mode 100755 index 0000000000..13bed157c3 --- /dev/null +++ b/integration_testing/features/use-channels-with-view-only-access.feature @@ -0,0 +1,44 @@ +Feature: Use channels with view-only access + + Background: + Given I am signed in to Studio as a non-admin user + And I am on the editor page + And I have view-only permissions for + + Scenario: Navigate topic tree + When I click the topic + Then I see its subtopics and resources + When I click the *>* button for the topic when collapsed + Then I see the its subtopics unfold + When I click the *Collapse all* button + Then I see that all topics with subtopics collapse + When I hover over a topic + And I click on a *···* button for more options + Then I can see the *View details* option + And I can see the *Copy to clipboard* option + But I do not see any other options + + Scenario: View details for a topic + When I hover over a topic + And I click on a *···* button for more options + Then I can see the *View details* option + When I select the *View details* option + Then I can see the *Topic* pane open on the right + And I can see all the details for the topic + + Scenario: View details for a resource + When I hover over a type of resource + And I click on a *···* button for more options + And I select the *View details* option + Then I can see the pane for the resource opens on the right + And I can see all the details for the resource + + Scenario: Copy topic or resource to the clipboard from *···* options + When I hover over a resource in the topic tree + And I click on a *···* button for more options + And I select the *Copy to clipboard* option + Then I see the *Creating 1 copy on clipboard* snackbar notification + And I see the *Cancel* button + + Examples: + | topic | kind | resource | \ No newline at end of file diff --git a/integration_testing/features/view-channel-details.feature b/integration_testing/features/view-channel-details.feature new file mode 100755 index 0000000000..743ec2d1eb --- /dev/null +++ b/integration_testing/features/view-channel-details.feature @@ -0,0 +1,37 @@ +Feature: View channel details + + Background: + Given I am signed in to Studio as a non-admin user + And I am on any of the tabs (*My Channels*, *Starred*, *View only*, or *Content Library*) + + Scenario: Open channel details + When I click the *i* button for the desired + Then I see a new page with channel details + And I see the detailed information for the (token, size and resources, language, etc.) + + Scenario: Copy channel token + Given I am on channel details page + And I see the channel token + And I see the token *Copy* button + When I click the *Copy* button + Then I see the snackbar notification that the token is copied in to the clipboard + When I use the paste feature (Ctrl+V) + Then I see the channel token pasted + + Scenario: Download files with the channel summary + Given I am on channel details page + And I see the *Download channel summary* button + When I click the *Download channel summary* button + Then I see the options to download summary as PDF and CSV files + When I select the option to download PDF + Then I can save and open the PDF file in my default system PDF reader application + When I select the option to download CSV + Then I can save and open the CSV file in my default system CSV application + + Scenario: Close channel details page + When I click the *X* button in the top bar + Then I don't see the channel details page any more + And I see the channel list on the tab where I initially opened it + + Examples: + | channel | token | diff --git a/integration_testing/features/view-resource-details.feature b/integration_testing/features/view-resource-details.feature new file mode 100755 index 0000000000..dcae2944d4 --- /dev/null +++ b/integration_testing/features/view-resource-details.feature @@ -0,0 +1,10 @@ +Feature: Click the information button + + Background: + Given I choose a destination to move content into + And I click the information button on a particular topic or content list item + + Scenario: Click the information button + When I click the information button + Then a sidebar opens from the right side of the screen + And here I can preview the content in question and view the metadata associated \ No newline at end of file diff --git a/integration_testing/features/view-support-links.feature b/integration_testing/features/view-support-links.feature new file mode 100755 index 0000000000..741274a52d --- /dev/null +++ b/integration_testing/features/view-support-links.feature @@ -0,0 +1,14 @@ +Feature: View support links + + Background: + Given I am signed in to Studio as a non-admin user + And I am on Studio *Settings > About Studio* page + + Scenario: View resources + When I click the *Kolibri Studio User Guide* link + Then a new browser tab opens with the ReadTheDocs page + # Privacy Policy page not yet implemented + + Scenario: View notable issues + When I click one of the notable issue hyperlinks + Then a new browser tab opens with the GitHub issue in question \ No newline at end of file