mirror of
https://github.com/vale981/Vulcan
synced 2025-03-05 09:31:43 -05:00
more clean up
This commit is contained in:
parent
6384c271b1
commit
f7026f10a8
8 changed files with 0 additions and 686 deletions
|
@ -1,20 +0,0 @@
|
|||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*.{js,html}]
|
||||
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_brace_style = 1TBS
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
insert_final_newline = true
|
||||
max_line_length = 80
|
||||
quote_type = auto
|
||||
spaces_around_operators = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
|
||||
trim_trailing_whitespace = false
|
44
.eslintrc
44
.eslintrc
|
@ -1,44 +0,0 @@
|
|||
/* Galaxy's Javascript linting configuration (Meteor)
|
||||
*
|
||||
* Documentation on rules can be found at:
|
||||
* http://eslint.org/docs/rules/ <- Optionally append the rulename
|
||||
*
|
||||
* Ensure changes are kept in sync with the base linting configuration.
|
||||
*/
|
||||
|
||||
{
|
||||
"extends": ".eslintrc-meteor",
|
||||
"env": {
|
||||
/* Allows global vars from the Meteor environment to pass and enables certain rules */
|
||||
"meteor": true
|
||||
},
|
||||
"rules": {
|
||||
|
||||
/* ---------------- Rules relaxed for Meteor's sake --------------------- */
|
||||
|
||||
/* allows use of var (remove when we are ready to switch to ES6) */
|
||||
"no-var": 0,
|
||||
|
||||
/* allows anonymous functions */
|
||||
"func-names": 0,
|
||||
|
||||
/* allows var = function() delcarations */
|
||||
"func-style": 0,
|
||||
|
||||
/* relaxes max-len to 100 chars per line */
|
||||
"max-len": [2, 100, 2],
|
||||
|
||||
/* relaxes requirement to put all vars at the top of the scope */
|
||||
"vars-on-top": 0,
|
||||
|
||||
/* relaxes dangling commas enforcement */
|
||||
"comma-dangle": 0,
|
||||
|
||||
/* allows certain non-constructor functions to start with a capital letter, */
|
||||
"new-cap": [2, { "capIsNewExceptions": [
|
||||
"Match", "Any", "Object", "ObjectIncluding", "OneOf", "Optional", "Where"
|
||||
]}],
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
}
|
||||
}
|
189
.jshintrc
189
.jshintrc
|
@ -1,189 +0,0 @@
|
|||
//.jshintrc
|
||||
{
|
||||
// JSHint Meteor Configuration File
|
||||
// Match the Meteor Style Guide
|
||||
//
|
||||
// By @raix with contributions from @aldeed and @awatson1978
|
||||
// Source https://github.com/raix/Meteor-jshintrc
|
||||
//
|
||||
// See http://jshint.com/docs/ for more details
|
||||
|
||||
"maxerr" : 50, // {int} Maximum error before stopping
|
||||
|
||||
// Enforcing
|
||||
"bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
|
||||
"camelcase" : true, // true: Identifiers must be in camelCase
|
||||
// "curly" : true, // true: Require {} for every new block or scope
|
||||
"eqeqeq" : true, // true: Require triple equals (===) for comparison
|
||||
"forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty()
|
||||
"immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`
|
||||
"indent" : 2, // {int} Number of spaces to use for indentation
|
||||
"latedef" : false, // true: Require variables/functions to be defined before being used
|
||||
"newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()`
|
||||
"noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
|
||||
"noempty" : true, // true: Prohibit use of empty blocks
|
||||
"nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment)
|
||||
"plusplus" : false, // true: Prohibit use of `++` & `--`
|
||||
"quotmark" : false, // Quotation mark consistency:
|
||||
// false : do nothing (default)
|
||||
// true : ensure whatever is used is consistent
|
||||
// "single" : require single quotes
|
||||
// "double" : require double quotes
|
||||
"undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
|
||||
"unused" : true, // true: Require all defined variables be used
|
||||
"strict" : false, // true: Requires all functions run in ES5 Strict Mode
|
||||
"trailing" : true, // true: Prohibit trailing whitespaces
|
||||
"maxparams" : false, // {int} Max number of formal params allowed per function
|
||||
"maxdepth" : false, // {int} Max depth of nested blocks (within functions)
|
||||
"maxstatements" : false, // {int} Max number statements per function
|
||||
"maxcomplexity" : false, // {int} Max cyclomatic complexity per function
|
||||
"maxlen" : false, // {int} Max number of characters per line
|
||||
|
||||
// Relaxing
|
||||
"asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
|
||||
"boss" : false, // true: Tolerate assignments where comparisons would be expected
|
||||
"debug" : false, // true: Allow debugger statements e.g. browser breakpoints.
|
||||
"eqnull" : false, // true: Tolerate use of `== null`
|
||||
"es5" : false, // true: Allow ES5 syntax (ex: getters and setters)
|
||||
"esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`)
|
||||
"moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
|
||||
// (ex: `for each`, multiple try/catch, function expression…)
|
||||
"evil" : false, // true: Tolerate use of `eval` and `new Function()`
|
||||
"expr" : false, // true: Tolerate `ExpressionStatement` as Programs
|
||||
"funcscope" : false, // true: Tolerate defining variables inside control statements"
|
||||
"globalstrict" : true, // true: Allow global "use strict" (also enables 'strict')
|
||||
"iterator" : false, // true: Tolerate using the `__iterator__` property
|
||||
"lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
|
||||
"laxbreak" : false, // true: Tolerate possibly unsafe line breakings
|
||||
"laxcomma" : false, // true: Tolerate comma-first style coding
|
||||
"loopfunc" : false, // true: Tolerate functions being defined in loops
|
||||
"multistr" : false, // true: Tolerate multi-line strings
|
||||
"proto" : false, // true: Tolerate using the `__proto__` property
|
||||
"scripturl" : false, // true: Tolerate script-targeted URLs
|
||||
"smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment
|
||||
"shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
|
||||
"sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
|
||||
"supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;`
|
||||
"validthis" : false, // true: Tolerate using this in a non-constructor function
|
||||
|
||||
// Environments
|
||||
"browser" : true, // Web Browser (window, document, etc)
|
||||
"couch" : false, // CouchDB
|
||||
"devel" : true, // Development/debugging (alert, confirm, etc)
|
||||
"dojo" : false, // Dojo Toolkit
|
||||
"jasmine" : true, // Jasmine testing framework
|
||||
"jquery" : false, // jQuery
|
||||
"mootools" : false, // MooTools
|
||||
"node" : false, // Node.js
|
||||
"nonstandard" : false, // Widely adopted globals (escape, unescape, etc)
|
||||
"prototypejs" : false, // Prototype and Scriptaculous
|
||||
"rhino" : false, // Rhino
|
||||
"worker" : false, // Web Workers
|
||||
"wsh" : false, // Windows Scripting Host
|
||||
"yui" : false, // Yahoo User Interface
|
||||
//"meteor" : false, // Meteor.js
|
||||
|
||||
// Legacy
|
||||
"nomen" : false, // true: Prohibit dangling `_` in variables
|
||||
"onevar" : false, // true: Allow only one `var` statement per function
|
||||
"passfail" : false, // true: Stop on first error
|
||||
"white" : false, // true: Check against strict whitespace and indentation rules
|
||||
|
||||
// Custom globals, from http://docs.meteor.com, in the order they appear there
|
||||
"globals" : {
|
||||
"Meteor": false,
|
||||
"DDP": false,
|
||||
"Mongo": false, //Meteor.Collection renamed to Mongo.Collection
|
||||
"Session": false,
|
||||
"Accounts": false,
|
||||
"Template": false,
|
||||
"Blaze": false, //UI is being renamed Blaze
|
||||
"UI": false,
|
||||
"Match": false,
|
||||
"check": false,
|
||||
"Tracker": false, //Deps renamed to Tracker
|
||||
"Deps": false,
|
||||
"ReactiveVar": false,
|
||||
"EJSON": false,
|
||||
"HTTP": false,
|
||||
"Email": false,
|
||||
"Assets": false,
|
||||
"Handlebars": false, // https://github.com/meteor/meteor/wiki/Handlebars
|
||||
"Package": false,
|
||||
|
||||
// Meteor internals
|
||||
"DDPServer": false,
|
||||
"global": false,
|
||||
"Log": false,
|
||||
"MongoInternals": false,
|
||||
"process": false,
|
||||
"WebApp": false,
|
||||
"WebAppInternals": false,
|
||||
|
||||
// globals useful when creating Meteor packages
|
||||
"Npm": false,
|
||||
"Tinytest": false,
|
||||
|
||||
// Meteor packages
|
||||
"$": false,
|
||||
"_": false,
|
||||
"__": false,
|
||||
"AccountsTemplates": false,
|
||||
"AutoForm": false,
|
||||
"Avatar": false,
|
||||
"Cookie": false,
|
||||
"FastRender": false,
|
||||
"Gravatar": false,
|
||||
"Herald": false,
|
||||
"Kadira": false,
|
||||
"moment": false,
|
||||
"Random": false,
|
||||
"RouteController": false,
|
||||
"Router": false,
|
||||
"SEO": false,
|
||||
"SimpleSchema": false,
|
||||
"SubsManager": false,
|
||||
"SyncedCron": false,
|
||||
"TAPi18n": false,
|
||||
|
||||
// Telescope collections
|
||||
"Categories": true,
|
||||
"Comments": true,
|
||||
"Feeds": true,
|
||||
"Invites": true,
|
||||
"Migrations": true,
|
||||
"Posts": true,
|
||||
"Releases": true,
|
||||
"Searches": true,
|
||||
"Users": true,
|
||||
|
||||
// Telescope objects
|
||||
"buildAndSendEmail": true,
|
||||
"buildEmailNotification": true,
|
||||
"buildEmailTemplate": true,
|
||||
"compareVersions": true,
|
||||
"coreSubscriptions": true,
|
||||
"daysPerPage": true,
|
||||
"deleteDummyContent": true,
|
||||
"Events": true,
|
||||
"fetchFeeds": true,
|
||||
"getCategoryUrl": true,
|
||||
"getEmailTemplate": true,
|
||||
"getPostCategories": true,
|
||||
"getTemplate": true,
|
||||
"getVotePower": true,
|
||||
"i18n": true,
|
||||
"InviteSchema": true,
|
||||
"logEvent": true,
|
||||
"marked": true,
|
||||
"Messages": true,
|
||||
"Pages": true,
|
||||
"sendEmail": true,
|
||||
"serveAPI": true,
|
||||
"Settings": true,
|
||||
"Telescope": true,
|
||||
"templates": true,
|
||||
"themeSettings": true
|
||||
},
|
||||
"esnext": true
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
for f in $(find $1); do
|
||||
echo \'$f\',
|
||||
done
|
|
@ -1,33 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
describe('test mobile nav', function() {
|
||||
|
||||
beforeEach(function (done) {
|
||||
// Make sure the mobile menu is open
|
||||
$('.mobile-menu-button').click();
|
||||
setTimeout(function () {
|
||||
expect($('.mobile-nav').css('left')).toBe('0px');
|
||||
done();
|
||||
}, 500);
|
||||
});
|
||||
|
||||
it('should close when clicked outside', function (done) {
|
||||
$('.inner-wrapper').click();
|
||||
setTimeout(function () {
|
||||
var width = $('.mobile-nav').width();
|
||||
// This is a pretty hacky check that's necessary because different testing environments
|
||||
// change the width of .mobile-nav which in turn changes the left value.
|
||||
var expectedLeft = width === 0 ? '60px' : '-200px';
|
||||
expect($('.mobile-nav').css('left')).toBe(expectedLeft);
|
||||
done();
|
||||
}, 500);
|
||||
});
|
||||
|
||||
it('should not close when clicked inside', function (done) {
|
||||
$('.mobile-nav').click();
|
||||
setTimeout(function () {
|
||||
expect($('.mobile-nav').css('left')).toBe('0px');
|
||||
done();
|
||||
}, 500);
|
||||
});
|
||||
});
|
|
@ -1,101 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
describe('test clicking vote buttons', function () {
|
||||
var $div;
|
||||
// Setting layoutTemplate to null to avoid stubbing the template completely.
|
||||
// Must happen here, because it will have otherwise run by the time beforeEach runs.
|
||||
Router.configure({
|
||||
layoutTemplate: null
|
||||
});
|
||||
|
||||
beforeEach(function () {
|
||||
$div = $('<div>');
|
||||
});
|
||||
|
||||
var render = function (data) {
|
||||
return Blaze.renderWithData(Template.comment_item, data || {}, $div.get(0));
|
||||
};
|
||||
|
||||
var shouldRedirectIfLoggedOut = function (selector) {
|
||||
render();
|
||||
|
||||
spyOn(Meteor, 'user').and.returnValue(false);
|
||||
var routerSpy = spyOn(Router, 'go');
|
||||
var flashMessageSpy = spyOn(window, 'Messages.flash');
|
||||
var meteorCallSpy = spyOn(Meteor, 'call');
|
||||
|
||||
$div.find(selector).click();
|
||||
|
||||
expect(routerSpy.calls.count()).toEqual(1);
|
||||
expect(routerSpy).toHaveBeenCalledWith('atSignIn');
|
||||
expect(flashMessageSpy.calls.count()).toEqual(1);
|
||||
expect(meteorCallSpy.calls.count()).toEqual(0);
|
||||
};
|
||||
|
||||
it('should redirect to the sign in page if logged out after upvoting', function () {
|
||||
shouldRedirectIfLoggedOut('.not-upvoted .upvote');
|
||||
});
|
||||
|
||||
it('should redirect to the sign in page if logged out after removing upvote', function () {
|
||||
spyOn(Template.comment_item.__helpers, ' upvoted').and.returnValue(true);
|
||||
shouldRedirectIfLoggedOut('.upvoted .upvote');
|
||||
});
|
||||
|
||||
it('should redirect to the sign in page if logged out after downvoting', function () {
|
||||
shouldRedirectIfLoggedOut('.not-downvoted .downvote');
|
||||
});
|
||||
|
||||
it('should redirect to the sign in page if logged out after removing downvote', function () {
|
||||
spyOn(Template.comment_item.__helpers, ' downvoted').and.returnValue(true);
|
||||
shouldRedirectIfLoggedOut('.downvoted .downvote');
|
||||
});
|
||||
|
||||
var shouldSendVoteAndTrack = function (selector, meteorMethodName, eventName) {
|
||||
var data = {
|
||||
_id: 'id',
|
||||
post: 'postId',
|
||||
userId: 'userId'
|
||||
};
|
||||
|
||||
render(data);
|
||||
|
||||
spyOn(Meteor, 'user').and.returnValue(true);
|
||||
var routerSpy = spyOn(Router, 'go');
|
||||
var flashMessageSpy = spyOn(window, 'Messages.flash');
|
||||
var trackEventSpy = spyOn(window, 'trackEvent').and.stub();
|
||||
var meteorCallSpy = spyOn(Meteor, 'call').and.callFake(function (methodName, context, callback) {
|
||||
callback();
|
||||
});
|
||||
|
||||
$div.find(selector).click();
|
||||
|
||||
expect(routerSpy.calls.count()).toEqual(0);
|
||||
expect(flashMessageSpy.calls.count()).toEqual(0);
|
||||
expect(meteorCallSpy.calls.count()).toEqual(1);
|
||||
expect(meteorCallSpy.calls.first().args[0]).toEqual(meteorMethodName);
|
||||
expect(trackEventSpy.calls.count()).toEqual(1);
|
||||
expect(trackEventSpy).toHaveBeenCalledWith(eventName, {
|
||||
'commentId': data._id,
|
||||
'postId': data.post,
|
||||
'authorId': data.userId
|
||||
});
|
||||
};
|
||||
|
||||
it('should send upvote and track event', function () {
|
||||
shouldSendVoteAndTrack('.not-upvoted .upvote', 'upvoteComment', 'post upvoted');
|
||||
});
|
||||
|
||||
it('should remove upvote and track event', function () {
|
||||
spyOn(Template.comment_item.__helpers, ' upvoted').and.returnValue(true);
|
||||
shouldSendVoteAndTrack('.upvoted .upvote', 'cancelUpvoteComment', 'post upvote cancelled');
|
||||
});
|
||||
|
||||
it('should send downvote and track event', function () {
|
||||
shouldSendVoteAndTrack('.not-downvoted .downvote', 'downvoteComment', 'post downvoted');
|
||||
});
|
||||
|
||||
it('should remove downvote and track event', function () {
|
||||
spyOn(Template.comment_item.__helpers, ' downvoted').and.returnValue(true);
|
||||
shouldSendVoteAndTrack('.downvoted .downvote', 'cancelDownvoteComment', 'post downvote cancelled');
|
||||
});
|
||||
});
|
|
@ -1,234 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
describe('test nav template', function() {
|
||||
var $div;
|
||||
// Setting layoutTemplate to null to avoid stubbing the template completely.
|
||||
// Must happen here, because it will have otherwise run by the time beforeEach runs.
|
||||
Router.configure({
|
||||
layoutTemplate: null
|
||||
});
|
||||
|
||||
beforeEach(function () {
|
||||
$div = $('<div>');
|
||||
});
|
||||
|
||||
var render = function () {
|
||||
Blaze.render(Template.nav, $div.get(0));
|
||||
};
|
||||
|
||||
it('should render mobile menu button', function () {
|
||||
render();
|
||||
|
||||
var mobileMenuButton = $div.find('a.mobile-only.mobile-menu-button');
|
||||
expect(mobileMenuButton.length).toEqual(1);
|
||||
expect(mobileMenuButton.attr('href')).toEqual('#menu');
|
||||
|
||||
expect(mobileMenuButton.find('svg').length).toEqual(1);
|
||||
});
|
||||
|
||||
it('should render the logo from the setting', function () {
|
||||
spyOn(window, 'Settings.get').and.callFake(function (settingName) {
|
||||
return settingName;
|
||||
});
|
||||
|
||||
render();
|
||||
|
||||
var h1 = $div.find('h1.logo');
|
||||
expect(h1.length).toEqual(1);
|
||||
var link = h1.find('a');
|
||||
expect(link.length).toEqual(1);
|
||||
expect(link.attr('href')).toEqual('/');
|
||||
expect(link.find('img').length).toEqual(1);
|
||||
expect(link.find('img').attr('src')).toEqual('logoUrl');
|
||||
expect(link.find('img').attr('alt')).toEqual('title');
|
||||
});
|
||||
|
||||
it('should render the site title if logo_url setting is empty', function () {
|
||||
spyOn(window, 'Settings.get').and.callFake(function (settingName) {
|
||||
if (settingName === 'logoUrl') {
|
||||
return null;
|
||||
}
|
||||
|
||||
return settingName;
|
||||
});
|
||||
|
||||
render();
|
||||
|
||||
var h1 = $div.find('h1.logo');
|
||||
expect(h1.length).toEqual(1);
|
||||
var link = h1.find('a');
|
||||
expect(link.length).toEqual(1);
|
||||
expect(link.attr('href')).toEqual('/');
|
||||
expect(link.find('img').length).toEqual(0);
|
||||
expect(link.text()).toEqual('title');
|
||||
});
|
||||
|
||||
describe('test primaryNav and secondaryNav', function () {
|
||||
var globalPrimaryNav, globalSecondaryNav;
|
||||
|
||||
beforeEach(function () {
|
||||
globalPrimaryNav = primaryNav;
|
||||
primaryNav = [];
|
||||
globalSecondaryNav = secondaryNav;
|
||||
secondaryNav = [];
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
primaryNav = globalPrimaryNav;
|
||||
secondaryNav = globalSecondaryNav;
|
||||
});
|
||||
|
||||
var setupNavTemplatesWithSpies = function (templateNames, renderFunction) {
|
||||
var navSpies = {};
|
||||
|
||||
templateNames.forEach(function (templateName) {
|
||||
Template[templateName] = new Blaze.Template(
|
||||
templateName,
|
||||
renderFunction.bind(null, templateName)
|
||||
);
|
||||
navSpies[templateName] = spyOn(Template[templateName], 'renderFunction').and.callThrough();
|
||||
});
|
||||
|
||||
return navSpies;
|
||||
};
|
||||
|
||||
var checkNavListAndDeleteTemplates = function (renderedNav, templateNames, navSpies, contentFunction) {
|
||||
var list = renderedNav.find('li');
|
||||
expect(list.length).toEqual(templateNames.length);
|
||||
// Check that each of the <li>s contains the expected content and that the corresponding
|
||||
// renderFunction was called.
|
||||
list.each(function (index, el) {
|
||||
var templateName = templateNames[index];
|
||||
var navSpy = navSpies[templateName];
|
||||
expect(navSpy.calls.count()).toEqual(1);
|
||||
expect(el.innerHTML.trim()).toEqual(contentFunction(templateName));
|
||||
|
||||
// Cleanup test template
|
||||
delete Template[templateName];
|
||||
});
|
||||
};
|
||||
|
||||
var testNav = function (templateNames, expectedSelector) {
|
||||
var randomString = Math.random();
|
||||
|
||||
var getNavContent = function (templateName) {
|
||||
return 'nav entry: ' + templateName + randomString;
|
||||
};
|
||||
var navSpies = setupNavTemplatesWithSpies(templateNames, getNavContent);
|
||||
|
||||
spyOn(window, 'getThemeSetting').and.returnValue(true);
|
||||
|
||||
render();
|
||||
|
||||
var renderedNav = $div.find(expectedSelector);
|
||||
expect(renderedNav.length).toEqual(1);
|
||||
// Check that dropdownClass was added
|
||||
renderedNav.hasClass('has-dropdown');
|
||||
|
||||
checkNavListAndDeleteTemplates(
|
||||
renderedNav,
|
||||
templateNames,
|
||||
navSpies,
|
||||
getNavContent
|
||||
);
|
||||
};
|
||||
|
||||
it('should render primary nav from global primaryNav array of template names', function () {
|
||||
var templateNames = ['testNavTemplate1', 'testNavTemplate2'];
|
||||
primaryNav = templateNames.map(function (templateName, index) {
|
||||
return {
|
||||
template: templateName,
|
||||
order: index
|
||||
};
|
||||
});
|
||||
|
||||
testNav(templateNames, 'ul.nav.primary-nav.desktop-nav');
|
||||
});
|
||||
|
||||
it('should not render primary nav if global primaryNav array is empty', function () {
|
||||
primaryNav = [];
|
||||
|
||||
render();
|
||||
|
||||
// Look for broad selector just to make sure no .primary-nav exists
|
||||
var renderedPrimaryNav = $div.find('.primary-nav');
|
||||
expect(renderedPrimaryNav.length).toEqual(0);
|
||||
});
|
||||
|
||||
it('should render secondary nav from global secondaryNav array of template names', function () {
|
||||
var templateNames = ['testNavTemplate1', 'testNavTemplate2'];
|
||||
secondaryNav = templateNames.map(function (templateName, index) {
|
||||
return {
|
||||
template: templateName,
|
||||
order: index
|
||||
};
|
||||
});
|
||||
|
||||
testNav(templateNames, 'ul.nav.secondary-nav.desktop-nav');
|
||||
});
|
||||
|
||||
it('should not render secondary nav if global secondaryNav array is empty', function () {
|
||||
secondaryNav = [];
|
||||
|
||||
render();
|
||||
|
||||
// Look for broad selector just to make sure no .secondary-nav exists
|
||||
var renderedSecondaryNav = $div.find('.secondary-nav');
|
||||
expect(renderedSecondaryNav.length).toEqual(0);
|
||||
});
|
||||
|
||||
var setupAndRenderNavs = function () {
|
||||
primaryNav = [{
|
||||
template: 'testPrimaryNavTemplate',
|
||||
order: 10
|
||||
}];
|
||||
secondaryNav = [{
|
||||
template: 'testSecondaryNavTemplate',
|
||||
order: 10
|
||||
}];
|
||||
|
||||
var getNavContent = function (templateName) {
|
||||
return templateName;
|
||||
};
|
||||
setupNavTemplatesWithSpies(
|
||||
[primaryNav[0].template, secondaryNav[0].template],
|
||||
getNavContent
|
||||
);
|
||||
|
||||
render();
|
||||
};
|
||||
|
||||
it('should render secondary nav directly after primary nav', function () {
|
||||
setupAndRenderNavs();
|
||||
|
||||
var renderedPrimaryNav = $div.find('ul.nav.primary-nav');
|
||||
expect(renderedPrimaryNav.length).toEqual(1);
|
||||
var renderedSecondaryNav = $div.find('ul.nav.secondary-nav');
|
||||
expect(renderedSecondaryNav.length).toEqual(1);
|
||||
|
||||
expect(renderedPrimaryNav.next()).toEqual(renderedSecondaryNav);
|
||||
});
|
||||
|
||||
it('should have "has-dropdown" class if useDropdowns theme setting is true', function () {
|
||||
spyOn(window, 'getThemeSetting').and.returnValue(true);
|
||||
|
||||
setupAndRenderNavs();
|
||||
|
||||
var renderedPrimaryNav = $div.find('ul.nav.primary-nav.has-dropdown');
|
||||
expect(renderedPrimaryNav.length).toEqual(1);
|
||||
var renderedSecondaryNav = $div.find('ul.nav.secondary-nav.has-dropdown');
|
||||
expect(renderedSecondaryNav.length).toEqual(1);
|
||||
});
|
||||
|
||||
it('should have "no-dropdown" class if useDropdowns theme setting is true', function () {
|
||||
spyOn(window, 'getThemeSetting').and.returnValue(false);
|
||||
|
||||
setupAndRenderNavs();
|
||||
|
||||
var renderedPrimaryNav = $div.find('ul.nav.primary-nav.no-dropdown');
|
||||
expect(renderedPrimaryNav.length).toEqual(1);
|
||||
var renderedSecondaryNav = $div.find('ul.nav.secondary-nav.no-dropdown');
|
||||
expect(renderedSecondaryNav.length).toEqual(1);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -1,62 +0,0 @@
|
|||
'use strict';
|
||||
|
||||
Jasmine.onTest(function () {
|
||||
describe('test permissions', function () {
|
||||
var testCanViewMeta = function (testFunc, requireViewInviteEnabled, mockValue, expected) {
|
||||
Settings.remove({});
|
||||
Settings.insert({'requireViewInvite': requireViewInviteEnabled});
|
||||
|
||||
var canView = testFunc(mockValue);
|
||||
expect(canView).toEqual(expected);
|
||||
};
|
||||
describe('test Users.can.view()', function () {
|
||||
|
||||
var testCanView = function (requireViewInviteEnabled, mockUser, expected) {
|
||||
testCanViewMeta(Users.can.view, requireViewInviteEnabled, mockUser, expected);
|
||||
};
|
||||
|
||||
it('should return true when requireViewInvite setting is false', function () {
|
||||
testCanView(false, {}, true);
|
||||
});
|
||||
|
||||
it('should return false when requireViewInvite setting is true and user is null', function () {
|
||||
testCanView(true, null, false);
|
||||
});
|
||||
|
||||
it('should return false when requireViewInvite setting is true and user is neither admin nor invited', function () {
|
||||
testCanView(true, {}, false);
|
||||
});
|
||||
|
||||
it('should return true when requireViewInvite setting is true and user is admin', function () {
|
||||
testCanView(true, {isAdmin: true}, true);
|
||||
});
|
||||
|
||||
it('should return true when requireViewInvite setting is true and user is invited', function () {
|
||||
testCanView(true, {isInvited: true}, true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('test Users.can.viewById()', function () {
|
||||
var testCanViewById = function (requireViewInviteEnabled, mockUserId, expected) {
|
||||
testCanViewMeta(Users.can.viewById, requireViewInviteEnabled, mockUserId, expected);
|
||||
};
|
||||
|
||||
it('should return true when requireViewInvite setting is false', function () {
|
||||
testCanViewById(false, 1, true);
|
||||
});
|
||||
|
||||
it('should return false when requireViewInvite setting is true and userId is null', function () {
|
||||
testCanViewById(true, null, false);
|
||||
});
|
||||
|
||||
it('should return true when requireViewInvite setting is true and user can view', function () {
|
||||
var canViewSpy = spyOn(can, 'view').and.returnValue(true);
|
||||
var userId = 5;
|
||||
testCanViewById(true, userId, true);
|
||||
|
||||
expect(canViewSpy.calls.count()).toEqual(1);
|
||||
expect(canViewSpy).toHaveBeenCalledWith(Meteor.users.findOne(userId));
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Add table
Reference in a new issue