Skip to content
This repository has been archived by the owner on Jan 28, 2020. It is now read-only.

Commit

Permalink
Added delete term functionality in taxonomy panel
Browse files Browse the repository at this point in the history
  • Loading branch information
amir-qayyum-khan authored and George Schneeloch committed Oct 7, 2015
1 parent 4350f8b commit 7ba38f3
Show file tree
Hide file tree
Showing 4 changed files with 351 additions and 8 deletions.
76 changes: 76 additions & 0 deletions rest/tests/test_vocabulary.py
Original file line number Diff line number Diff line change
Expand Up @@ -706,6 +706,82 @@ def get_facet_counts():
sorted([])
)

def test_index_updates_on_delete(self):
"""
Test that deleting vocabulary and terms will automatically update the
index.
"""
self.import_course_tarball(self.repo)
search_url = "{repo_base}{repo_slug}/search/".format(
repo_base=REPO_BASE,
repo_slug=self.repo.slug
)

def get_facet_counts():
"""Helper function to get facet_counts field."""
return as_json(self.client.get(search_url))["facet_counts"]

# No vocabs.
self.assertEqual(
sorted(["course", "run", "resource_type"]),
sorted(get_facet_counts().keys())
)

vocab = Vocabulary.objects.create(
repository=self.repo,
weight=1,
required=False,
vocabulary_type="m",
name="vocab1",
description="vocab1"
)

self.assertEqual(
sorted(["course", "run", "resource_type", vocab.slug]),
sorted(get_facet_counts().keys())
)

term1 = Term.objects.create(vocabulary=vocab, label="term1", weight=1)
term2 = Term.objects.create(vocabulary=vocab, label="term2", weight=2)

# Assign all types to vocab.
for resource in LearningResource.objects.all():
vocab.learning_resource_types.add(resource.learning_resource_type)

# No terms yet.
self.assertEqual(
sorted([t['key'] for t in
get_facet_counts()[vocab.slug]['values']]),
[]
)

resource1 = LearningResource.objects.all()[0]
resource1.terms.add(term1)
resource2 = LearningResource.objects.all()[1]
resource2.terms.add(term2)

# Vocab shows up because there are slugs here.
self.assertEqual(
sorted([t['key'] for t in
get_facet_counts()[vocab.slug]['values']]),
sorted([term1.slug, term2.slug])
)

# Term is removed from facet list.
self.delete_term(self.repo.slug, vocab.slug, term1.slug)
self.assertEqual(
sorted([t['key'] for t in
get_facet_counts()[vocab.slug]['values']]),
sorted([term2.slug])
)

self.delete_vocabulary(self.repo.slug, vocab.slug)
# No vocabs left.
self.assertEqual(
sorted(["course", "run", "resource_type"]),
sorted(get_facet_counts().keys())
)


class TestVocabularyAuthorization(RESTAuthTestCase):
"""
Expand Down
12 changes: 12 additions & 0 deletions rest/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,18 @@ def get_queryset(self):
slug=self.kwargs['term_slug']
)

def delete(self, request, *args, **kwargs):
"""
Override delete to also update index for deleted term.
"""
term = self.get_object()
resources = list(LearningResource.objects.filter(
terms__id=term.id
))
ret = super(TermDetail, self).delete(request, *args, **kwargs)
index_resources(resources)
return ret


class RepoMemberList(ListAPIView):
"""
Expand Down
208 changes: 206 additions & 2 deletions ui/jstests/test_manage_taxonomies.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ define(['QUnit', 'jquery', 'lodash', 'manage_taxonomies', 'react',
}
});

QUnit.test('Assert that TermComponent renders properly',
QUnit.test('Assert that edit TermComponent renders properly',
function(assert) {
assert.ok(TermComponent, "class object not found");
var done = assert.async();
Expand Down Expand Up @@ -475,7 +475,9 @@ define(['QUnit', 'jquery', 'lodash', 'manage_taxonomies', 'react',
);
component.forceUpdate(function() {
assert.equal(component.state.label, "TestB");

assert.equal(component.state.formatActionState, 'edit');
assert.equal(parentUpdateCount, 0);
// listing page was not asked to refresh
assert.equal(refreshCount, 0);
React.addons.TestUtils.Simulate.click(saveButton);
component.forceUpdate(function() {
Expand Down Expand Up @@ -534,6 +536,137 @@ define(['QUnit', 'jquery', 'lodash', 'manage_taxonomies', 'react',
}
);

QUnit.test('Assert that delete TermComponent renders properly',
function(assert) {
assert.ok(TermComponent, "class object not found");
var done = assert.async();
var term = {
"id": 9,
"slug": "test",
"label": "test",
"weight": 1
};
var parentUpdateCount = 0;
var deleteTerm = function() {
parentUpdateCount += 1;
};
var renderConfirmationDialog = function(options) {
options.confirmationHandler(true);
};

TestUtils.initMockjax({
url: "/api/v1/repositories/repo/vocabularies/difficulty/terms/test/",
type: "DELETE"
});

var refreshCount = 0;
var refreshFromAPI = function() {
refreshCount++;
};

var afterMount = function(component) {
var deleteButton = React.addons.TestUtils.
findRenderedDOMComponentWithClass(
component,
'revert-button'
);
//select delete
React.addons.TestUtils.Simulate.click(deleteButton);
component.forceUpdate(function() {
assert.equal(component.state.formatActionState, 'show');
waitForAjax(1, function() {
// term is delete in parent
assert.equal(parentUpdateCount, 1);
// listing was asked to refresh
assert.equal(refreshCount, 1);
done();
});
});
};

React.addons.TestUtils.
renderIntoDocument(
<TermComponent
term={term}
repoSlug="repo"
renderConfirmationDialog={renderConfirmationDialog}
deleteTerm={deleteTerm}
vocabulary={vocabulary}
refreshFromAPI={refreshFromAPI}
ref={afterMount}
/>
);
}
);

QUnit.test('Assert that delete ajax call fail TermComponent' +
' renders properly',
function(assert) {
assert.ok(TermComponent, "class object not found");
var done = assert.async();
var term = {
"id": 9,
"slug": "test",
"label": "test",
"weight": 1
};
var parentUpdateCount = 0;
var deleteTerm = function() {
parentUpdateCount += 1;
};
var renderConfirmationDialog = function(options) {
options.confirmationHandler(true);
};

TestUtils.initMockjax({
url: "/api/v1/repositories/repo/vocabularies/difficulty/terms/test/",
type: "DELETE",
status: 400
});

var refreshCount = 0;
var refreshFromAPI = function() {
refreshCount++;
};

var afterMount = function(component) {
var deleteButton = React.addons.TestUtils.
findRenderedDOMComponentWithClass(
component,
'revert-button'
);
//select delete
React.addons.TestUtils.Simulate.click(deleteButton);
component.forceUpdate(function() {
assert.equal(
component.state.errorMessage, ''
);
assert.equal(component.state.formatActionState, 'show');
waitForAjax(1, function() {
// check state of error message
assert.equal(
component.state.errorMessage, 'Unable to delete term.'
);
done();
});
});
};

React.addons.TestUtils.
renderIntoDocument(
<TermComponent
term={term}
repoSlug="repo"
renderConfirmationDialog={renderConfirmationDialog}
deleteTerm={deleteTerm}
vocabulary={vocabulary}
refreshFromAPI={refreshFromAPI}
ref={afterMount}
/>
);
}
);

QUnit.test('Assert that VocabularyComponent renders properly',
function(assert) {
assert.ok(VocabularyComponent, "class object not found");
Expand Down Expand Up @@ -2358,6 +2491,77 @@ define(['QUnit', 'jquery', 'lodash', 'manage_taxonomies', 'react',
}
);

QUnit.test('Assert that delete term works in TaxonomyComponent',
function(assert) {
assert.ok(TaxonomyComponent, "class object not found");
var done = assert.async();
var refreshCount = 0;
var refreshFromAPI = function() {
refreshCount++;
};

var renderConfirmationDialog = function(options) {
options.confirmationHandler(true);
};

var afterMount = function(component) {
assert.equal(
component.state.vocabularies.length,
0
);
waitForAjax(2, function() {
assert.equal(
component.state.vocabularies.length,
1
);
assert.equal(
component.state.vocabularies[0].terms.length,
2
);
var updateTermUrl = "/api/v1/repositories/repo/vocabularies/" +
component.state.vocabularies[0].vocabulary.slug + "/terms/" +
component.state.vocabularies[0].terms[0].slug + "/";
TestUtils.initMockjax({
url: updateTermUrl,
type: "DELETE"
});
var deleteButtons = React.addons.TestUtils.
scryRenderedDOMComponentsWithClass(
component,
'revert-button'
);
var deleteButton = deleteButtons[0];
//open edit mode
React.addons.TestUtils.Simulate.click(deleteButton);
component.forceUpdate(function() {
waitForAjax(1, function () {
assert.equal(refreshCount, 1);
//assert term update
assert.equal(
component.state.vocabularies.length,
1
);
assert.equal(
component.state.vocabularies[0].terms.length,
1
);
done();
});
});
});
};
React.addons.TestUtils.renderIntoDocument
(
<TaxonomyComponent
repoSlug="repo"
refreshFromAPI={refreshFromAPI}
renderConfirmationDialog={renderConfirmationDialog}
ref={afterMount}
/>
);
}
);

QUnit.test("Test that ManageTaxonomies.loader renders into div",
function(assert) {
var container = document.createElement("div");
Expand Down
Loading

0 comments on commit 7ba38f3

Please sign in to comment.