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
class KnowledgeExplorerController < ApplicationController
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({
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: {
onSearchTermChange(e) {
const term = e.target.value;
this.set("searchTerm", term);
Ember.run.debounce(this, this.performSearch, term, 250);
onSearchTermChange(event) {
const term = event.target.value;
Ember.run.debounce(this, this.onSearch, 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({
click() {
const tag = this.get("tag");
let filter = this.get("filterTags");
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);
this.selectTag(this.tag);
return false;
}
});

View File

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

View File

@ -2,6 +2,7 @@ import {
default as computed,
observes
} from "ember-addons/ember-computed-decorators";
import knowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer";
export default Ember.Controller.extend({
application: Ember.inject.controller(),
@ -18,23 +19,48 @@ export default Ember.Controller.extend({
selectedTopic: null,
searchCount: Ember.computed.readOnly("searchResults.length"),
emptySearchResults: Ember.computed.equal("searchCount", 0),
@computed("searchResults")
hasSearchResults(results) {
return !!results;
},
@computed("searchResults")
emptySearchResults(results) {
return results.length === 0;
},
@computed("searchResults")
searchCount(results) {
return results.length;
},
@computed("filterTags")
filtered(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";
export default {
search(tags, filter) {
if (tags) {
return ajax(
`/search.json?q=in:kb tags:${tags.replace(/ /g, "+")} ${filter}`
);
} else {
return ajax(`/search.json?q=in:kb ${filter}`);
}
//write as one liner
//use + instead of space for query param
search(filter, tags) {
let params = [filter];
if (tags) params.push(`tags:${tags}`);
const endpoint = `/search.json?q=in:kb ${params.join(" ")}`;
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>
<td class="main-link">
<span class="link-top-line">
{{knowledge-explorer-topic-link topic=topic selectedTopic=selectedTopic}}
{{knowledge-explorer-topic-link topic=topic selectTopic=selectTopic}}
</span>
<span class="link-bottom-line">
{{#each topic.tags as |tag|}}

View File

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

View File

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

View File

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

View File

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

View File

@ -1,3 +1,5 @@
# frozen_string_literal: true
# name: discourse-knowledge-explorer
# about: A plugin to make it easy to explore and find knowledge base-type articles in Discourse
# 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