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 @@
-
-
-
- {{ $tr('promptP1') }}
- {{ $tr('promptP2') }}
-
-
-
-
-
-
-
-
- {{ $tr('promptP1') }}
- {{ $tr('promptP2') }}
-
-
-
-
-
-
- {{ $tr('submittedP1') }}
- {{ $tr('submittedP2') }}
- {{ $tr('submittedP3') }}
-
-
-
-
-
-
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