Spec tests & minor refactors

This commit is contained in:
Justin DiRose 2019-09-17 12:54:24 -05:00
parent 1b9ea64f15
commit 5d0da1fe0a
15 changed files with 146 additions and 73 deletions

View File

@ -1,3 +1,5 @@
# frozen_string_literal: true
module KnowledgeExplorer module KnowledgeExplorer
class KnowledgeExplorerController < ApplicationController class KnowledgeExplorerController < ApplicationController
requires_plugin 'knowledge-explorer' requires_plugin 'knowledge-explorer'

View File

@ -1,29 +1,10 @@
import knowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer";
export default Ember.Component.extend({ export default Ember.Component.extend({
classNames: "knowledge-explorer-search", classNames: "knowledge-explorer-search",
performSearch(term) {
if (term.length < this.siteSettings.min_search_term_length) {
this.set("searchResults", null);
return;
}
// query the search api
const tags = this.get("filterTags") || null;
if (tags && tags.includes(" ")) {
tags.join(" ");
}
knowledgeExplorer.search(tags, term).then(result => {
this.set("searchResults", result.topics || []);
});
},
actions: { actions: {
onSearchTermChange(e) { onSearchTermChange(event) {
const term = e.target.value; const term = event.target.value;
this.set("searchTerm", term); Ember.run.debounce(this, this.onSearch, term, 250);
Ember.run.debounce(this, this.performSearch, term, 250);
} }
} }
}); });

View File

@ -1,3 +0,0 @@
export default Ember.Component.extend({
classNames: "knowledge-explorer-tags"
});

View File

@ -1,17 +1,6 @@
export default Ember.Component.extend({ export default Ember.Component.extend({
click() { click() {
const tag = this.get("tag"); this.selectTag(this.tag);
let filter = this.get("filterTags"); return false;
if (filter && filter.includes(tag.id)) {
filter = filter.replace(tag.id, "");
filter = filter.replace(" ", " ");
filter = filter.replace(/^\s+|\s+$/g, "");
} else if (filter) {
filter = `${filter} ${tag.id}`;
} else {
filter = tag.id;
}
this.set("filterTags", filter);
} }
}); });

View File

@ -1,5 +1,6 @@
export default Ember.Component.extend({ export default Ember.Component.extend({
click() { click() {
this.set("selectedTopic", this.topic.id); this.selectTopic(this.topic.id);
return false;
} }
}); });

View File

@ -2,6 +2,7 @@ import {
default as computed, default as computed,
observes observes
} from "ember-addons/ember-computed-decorators"; } from "ember-addons/ember-computed-decorators";
import knowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer";
export default Ember.Controller.extend({ export default Ember.Controller.extend({
application: Ember.inject.controller(), application: Ember.inject.controller(),
@ -18,23 +19,48 @@ export default Ember.Controller.extend({
selectedTopic: null, selectedTopic: null,
searchCount: Ember.computed.readOnly("searchResults.length"),
emptySearchResults: Ember.computed.equal("searchCount", 0),
@computed("searchResults") @computed("searchResults")
hasSearchResults(results) { hasSearchResults(results) {
return !!results; return !!results;
}, },
@computed("searchResults")
emptySearchResults(results) {
return results.length === 0;
},
@computed("searchResults")
searchCount(results) {
return results.length;
},
@computed("filterTags") @computed("filterTags")
filtered(filterTags) { filtered(filterTags) {
return !!filterTags; return !!filterTags;
},
actions: {
setSelectedTopic(topicID) {
this.set("selectedTopic", topicID);
},
updateSelectedTags(tag) {
let filter = this.filterTags;
if (filter && filter.includes(tag.id)) {
filter = filter.replace(tag.id, "");
filter = filter.replace("++", "+");
filter = filter.replace(/^\++|\++$/g, "");
} else if (filter) {
filter = `${filter}+${tag.id}`;
} else {
filter = tag.id;
}
this.set("filterTags", filter);
},
performSearch(term) {
if (term.length < this.siteSettings.min_search_term_length) {
this.set("searchResults", null);
return false;
}
const tags = this.get("filterTags") || null;
knowledgeExplorer.search(term, tags).then(result => {
this.set("searchResults", result.topics || []);
});
}
} }
}); });

View File

@ -1,13 +1,12 @@
import { ajax } from "discourse/lib/ajax"; import { ajax } from "discourse/lib/ajax";
export default { export default {
search(tags, filter) { //write as one liner
if (tags) { //use + instead of space for query param
return ajax( search(filter, tags) {
`/search.json?q=in:kb tags:${tags.replace(/ /g, "+")} ${filter}` let params = [filter];
); if (tags) params.push(`tags:${tags}`);
} else { const endpoint = `/search.json?q=in:kb ${params.join(" ")}`;
return ajax(`/search.json?q=in:kb ${filter}`); return ajax(endpoint);
}
} }
}; };

View File

@ -1,6 +0,0 @@
{{#each tags as |tag|}}
{{knowledge-explorer-tag
tag=tag
filterTags=filterTags
}}
{{/each}}

View File

@ -8,7 +8,7 @@
<tr> <tr>
<td class="main-link"> <td class="main-link">
<span class="link-top-line"> <span class="link-top-line">
{{knowledge-explorer-topic-link topic=topic selectedTopic=selectedTopic}} {{knowledge-explorer-topic-link topic=topic selectTopic=selectTopic}}
</span> </span>
<span class="link-bottom-line"> <span class="link-bottom-line">
{{#each topic.tags as |tag|}} {{#each topic.tags as |tag|}}

View File

@ -4,16 +4,18 @@
{{else}} {{else}}
<div class="knowledge-explorer-search"> <div class="knowledge-explorer-search">
{{knowledge-explorer-search {{knowledge-explorer-search
searchResults=searchResults onSearch=(action "performSearch")
searchTerm=searchTerm
filterTags=filterTags
}} }}
</div> </div>
<div class="knowledge-explorer-browse"> <div class="knowledge-explorer-browse">
{{knowledge-explorer-tag-list <div class="knowledge-explorer-tags">
tags=tags {{#each tags as |tag|}}
filterTags=filterTags {{knowledge-explorer-tag
}} tag=tag
selectTag=(action "updateSelectedTags")
}}
{{/each}}
</div>
<div class="knowledge-explorer-results"> <div class="knowledge-explorer-results">
{{#if hasSearchResults}} {{#if hasSearchResults}}
{{#if emptySearchResults}} {{#if emptySearchResults}}
@ -22,13 +24,13 @@
<div class="result-count">{{i18n 'knowledge_explorer.search.results' count=searchCount}}</div> <div class="result-count">{{i18n 'knowledge_explorer.search.results' count=searchCount}}</div>
{{knowledge-explorer-topic-list {{knowledge-explorer-topic-list
topics=searchResults topics=searchResults
selectedTopic=selectedTopic selectTopic=(action "setSelectedTopic")
}} }}
{{/if}} {{/if}}
{{else}} {{else}}
{{knowledge-explorer-topic-list {{knowledge-explorer-topic-list
topics=topics topics=topics
selectedTopic=selectedTopic selectTopic=(action "setSelectedTopic")
}} }}
{{/if}} {{/if}}
</div> </div>

View File

@ -1,3 +1,5 @@
# frozen_string_literal: true
require_dependency "knowledge_explorer_constraint" require_dependency "knowledge_explorer_constraint"
KnowledgeExplorer::Engine.routes.draw do KnowledgeExplorer::Engine.routes.draw do

View File

@ -1,3 +1,5 @@
# frozen_string_literal: true
module ::KnowledgeExplorer module ::KnowledgeExplorer
class Engine < ::Rails::Engine class Engine < ::Rails::Engine
isolate_namespace KnowledgeExplorer isolate_namespace KnowledgeExplorer

View File

@ -1,3 +1,5 @@
# frozen_string_literal: true
class KnowledgeExplorerConstraint class KnowledgeExplorerConstraint
def matches?(request) def matches?(request)
SiteSetting.knowledge_explorer_enabled SiteSetting.knowledge_explorer_enabled

View File

@ -1,3 +1,5 @@
# frozen_string_literal: true
# name: discourse-knowledge-explorer # name: discourse-knowledge-explorer
# about: A plugin to make it easy to explore and find knowledge base-type articles in Discourse # about: A plugin to make it easy to explore and find knowledge base-type articles in Discourse
# version: 0.1 # version: 0.1

View File

@ -0,0 +1,74 @@
# frozen_string_literal: true
require 'rails_helper'
describe KnowledgeExplorer::KnowledgeExplorerController do
let!(:category) { Fabricate(:category) }
let!(:topic) { Fabricate(:topic, category: category) }
let!(:topic2) { Fabricate(:topic, category: category) }
let!(:tag) { Fabricate(:tag, topics: [topic], name: 'test') }
before do
SiteSetting.tagging_enabled = true
SiteSetting.knowledge_explorer_enabled = true
SiteSetting.knowledge_explorer_categories = category.id.to_s
SiteSetting.knowledge_explorer_tags = 'test'
end
describe 'knowledge explorer data' do
context 'when any user' do
it 'should return the right response' do
get '/knowledge-explorer.json'
expect(response.status).to eq(200)
json = JSON.parse(response.body)
expect(json['tags'].size).to eq(1)
expect(json['topics'].size).to eq(2)
end
end
context "when some knowledge explorer topics are private" do
let!(:group) { Fabricate(:group) }
let!(:private_category) { Fabricate(:private_category, group: group) }
let!(:private_topic) { Fabricate(:topic, category: private_category) }
before do
SiteSetting.knowledge_explorer_categories = "#{category.id}|#{private_category.id}"
end
it 'should not show topics in private categories without permissions' do
get '/knowledge-explorer.json'
json = JSON.parse(response.body)
expect(json['topics'].size).to eq(2)
end
it 'should show topics when users have permissions' do
admin = Fabricate(:admin)
sign_in(admin)
get '/knowledge-explorer.json'
json = JSON.parse(response.body)
expect(json['topics'].size).to eq(3)
end
end
context 'when filtering by tag' do
it 'should return a filtered list' do
get '/knowledge-explorer.json?tags=test'
expect(response.status).to eq(200)
json = JSON.parse(response.body)
expect(json['tags'].size).to eq(1)
expect(json['topics'].size).to eq(1)
end
end
end
end