diff --git a/db/fixtures/009_users.rb b/db/fixtures/009_users.rb index 6532a8613a4..7effb73775a 100644 --- a/db/fixtures/009_users.rb +++ b/db/fixtures/009_users.rb @@ -22,4 +22,30 @@ User.seed do |u| u.trust_level = TrustLevel[4] end -Group.user_trust_level_change!(-1 ,TrustLevel[4]) +Group.user_trust_level_change!(-1, TrustLevel[4]) + +# User for the smoke tests +if ENV["SMOKE"] == "1" + smoke_user = User.seed do |u| + u.id = 0 + u.name = "smoke_user" + u.username = "smoke_user" + u.username_lower = "smoke_user" + u.email = "smoke_user@discourse.org" + u.password = "P4ssw0rd" + u.email_direct = false + u.email_digests = false + u.email_private_messages = false + u.active = true + u.approved = true + u.approved_at = Time.now + u.trust_level = TrustLevel[3] + end.first + + EmailToken.seed do |et| + et.id = 1 + et.user_id = smoke_user.id + et.email = smoke_user.email + et.confirmed = true + end +end diff --git a/lib/tasks/smoke_test.rake b/lib/tasks/smoke_test.rake index 91ac3ffe786..890eb128ad8 100644 --- a/lib/tasks/smoke_test.rake +++ b/lib/tasks/smoke_test.rake @@ -1,6 +1,5 @@ desc "run phantomjs based smoke tests on current build" task "smoke:test" do - phantom_path = File.expand_path('~/phantomjs/bin/phantomjs') phantom_path = nil unless File.exists?(phantom_path) phantom_path = phantom_path || 'phantomjs' diff --git a/spec/fixtures/images/large & unoptimized.png b/spec/fixtures/images/large & unoptimized.png new file mode 100644 index 00000000000..d00108698b9 Binary files /dev/null and b/spec/fixtures/images/large & unoptimized.png differ diff --git a/spec/phantom_js/smoke_test.js b/spec/phantom_js/smoke_test.js index 9e6d83aa398..032d5507432 100644 --- a/spec/phantom_js/smoke_test.js +++ b/spec/phantom_js/smoke_test.js @@ -1,41 +1,45 @@ /*global phantom:true */ -console.log('Starting Smoke Test'); -var system = require('system'); +console.log("Starting Discourse Smoke Test"); -if(system.args.length !== 2) { - console.log("expecting phantomjs {smoke_test.js} {base_url}"); +var system = require("system"); + +if (system.args.length !== 2) { + console.log("Expecting: phantomjs {smoke_test.js} {url}"); phantom.exit(1); } -var page = require('webpage').create(); +var TIMEOUT = 10000; +var page = require("webpage").create(); -page.waitFor = function(desc, fn, timeout, after) { - var check,start,promise; +page.viewportSize = { + width: 1366, + height: 768 +}; - start = +new Date(); - promise = {}; - check = function() { +// page.onConsoleMessage = function(msg) { +// console.log(msg); +// } + +page.waitFor = function(desc, fn, cb) { + var start = +new Date(); + + var check = function() { var r; - try { - r = page.evaluate(fn); - } - catch(err) { - // next time - } + try { r = page.evaluate(fn); } catch (err) { } var diff = (+new Date()) - start; - if(r) { - console.log("PASSED: " + desc + " " + diff + "ms" ); - after(true); + if (r) { + console.log("PASSED: " + desc + " - " + diff + "ms"); + cb(true); } else { - if(diff > timeout) { - console.log("FAILED: " + desc + " " + diff + "ms"); - after(false); + if (diff > TIMEOUT) { + console.log("FAILED: " + desc + " - " + diff + "ms"); + cb(false); } else { - setTimeout(check, 50); + setTimeout(check, 25); } } }; @@ -47,40 +51,61 @@ page.waitFor = function(desc, fn, timeout, after) { var actions = []; var test = function(desc, fn) { - actions.push({test: fn, desc: desc}); -}; + actions.push({ test: fn, desc: desc }); +} -var navigate = function(desc, fn) { - actions.push({navigate: fn, desc: desc}); -}; +var exec = function(desc, fn) { + actions.push({ exec: fn, desc: desc }); +} -var run = function(){ +var execAsync = function(desc, delay, fn) { + actions.push({ execAsync: fn, delay: delay, desc: desc }); +} + +var upload = function(input, path) { + actions.push({ upload: path, input: input }); +} + +var screenshot = function(filename) { + actions.push({ screenshot: filename }); +} + +var run = function() { var allPassed = true; + var done = function() { - if(allPassed) { - console.log("ALL PASSED"); - } else { - console.log("SMOKE TEST FAILED"); - } + console.log(allPassed ? "ALL PASSED" : "SMOKE TEST FAILED"); phantom.exit(); }; - var performNextAction = function(){ - if(actions.length === 0) { + var performNextAction = function() { + if (!allPassed || actions.length === 0) { done(); - } - else{ + } else { var action = actions[0]; actions = actions.splice(1); - if(action.test) { - page.waitFor(action.desc, action.test, 10000, function(success){ - allPassed = allPassed && success; + if (action.test) { + page.waitFor(action.desc, action.test, function(success) { + allPassed &= success; performNextAction(); }); - } - else if(action.navigate) { - console.log("NAVIGATE: " + action.desc); - page.evaluate(action.navigate); + } else if (action.exec) { + console.log("EXEC: " + action.desc); + page.evaluate(action.exec); + performNextAction(); + } else if (action.execAsync) { + console.log("EXEC ASYNC: " + action.desc + " - " + action.delay + "ms"); + setTimeout(function() { + page.evaluate(action.execAsync); + performNextAction(); + }, action.delay); + } else if (action.upload) { + console.log("UPLOAD: " + action.upload); + page.uploadFile(action.input, action.upload); + performNextAction(); + } else if (action.screenshot) { + console.log("SCREENSHOT: " + action.screenshot); + page.render(action.screenshot); performNextAction(); } } @@ -89,50 +114,123 @@ var run = function(){ performNextAction(); }; -page.runTests = function(){ +var runTests = function() { + + test("expect a log in button", function() { + return $(".login-button").text().trim() === "Log In"; + }); test("at least one topic shows up", function() { - return $('.topic-list tbody tr').length > 0; + return document.querySelector(".topic-list tbody tr"); }); - test("expect a log in button", function(){ - return $('.login-button').text().trim() === 'Log In'; + execAsync("navigate to 1st topic", 500, function() { + if ($(".main-link > a:first").length > 0) { + $(".main-link > a:first").click(); // topic list page + } else { + $(".featured-topic a.title:first").click(); // categories page + } }); - navigate("navigate to first topic", function(){ - Em.run.later(function(){ - if ($('.main-link > a:first').length > 0) { - $('.main-link > a:first').click(); // topic list page - } else { - $('.featured-topic a.title:first').click(); // categories page - } - }, 500); + test("at least one post body", function() { + return document.querySelector(".topic-post"); }); - test("at least one post body", function(){ - return $('.topic-post').length > 0; + execAsync("click on the 1st user", 500, function() { + // remove the popup action for testing + $(".topic-meta-data a:first").data("ember-action", ""); + $(".topic-meta-data a:first").focus().click(); }); - navigate("navigate to first user", function(){ - // for whatever reason the clicks do not respond at the begining - // defering - Em.run.later(function(){ - - // Remove the popup action for testing - $('.topic-meta-data a:first').data('ember-action', ''); - - $('.topic-meta-data a:first').focus().click(); - },500); + test("user has details", function() { + return document.querySelector("#user-card .names"); }); - test("has details",function(){ - return $('#user-card .names').length === 1; + exec("open login modal", function() { + $(".login-button").click(); + }); + + test("login modal is open", function() { + return document.querySelector(".login-modal"); + }); + + exec("type in credentials & log in", function() { + $("#login-account-name").val("smoke_user").trigger("change"); + $("#login-account-password").val("P4ssw0rd").trigger("change"); + $(".login-modal .btn-primary").click(); + }); + + test("is logged in", function() { + return document.querySelector(".current-user"); + }); + + exec("compose new topic", function() { + var date = " (" + (+new Date()) + ")", + title = "This is a new topic" + date, + post = "I can write a new topic inside the smoke test!" + date + "\n\n"; + + $("#create-topic").click(); + $("#reply-title").val(title).trigger("change"); + $("#reply-control .wmd-input").val(post).trigger("change"); + $("#reply-control .wmd-input").focus()[0].setSelectionRange(post.length, post.length); + }); + + exec("open upload modal", function() { + $(".wmd-image-button").click(); + }); + + test("upload modal is open", function() { + return document.querySelector("#filename-input"); + }); + + upload("#filename-input", "spec/fixtures/images/large & unoptimized.png"); + + exec("click upload button", function() { + $(".modal .btn-primary").click(); + }); + + test("image is uploaded", function() { + return document.querySelector(".cooked img"); + }); + + exec("submit the topic", function() { + $("#reply-control .create").click(); + }); + + test("topic is created", function() { + return document.querySelector(".fancy-title"); + }); + + exec("click reply button", function() { + $(".post-controls:first .create").click(); + }); + + test("composer is open", function() { + return document.querySelector("#reply-control .wmd-input"); + }); + + exec("compose reply", function() { + var post = "I can even write a reply inside the smoke test ;) (" + (+new Date()) + ")"; + $("#reply-control .wmd-input").val(post).trigger("change"); + }); + + test("waiting for the preview", function() { + return $(".wmd-preview").text().trim().indexOf("I can even write") === 0; + }); + + execAsync("submit the reply", 6000, function() { + $("#reply-control .create").click(); + }); + + test("reply is created", function() { + return !document.querySelector(".saving-text") + && $(".topic-post").length === 2; }); run(); }; -page.open(system.args[1], function (status) { - console.log("Opened " + system.args[1]); - page.runTests(); +page.open(system.args[1], function(status) { + console.log("OPENED: " + system.args[1]); + runTests(); });