import assert from 'assert';
import React from 'react'; // jshint ignore:line
import ChangeAvatarGallery, { Gallery, GalleryItem } from 'misago/components/change-avatar/gallery'; // jshint ignore:line
import misago from 'misago/index';
import snackbar from 'misago/services/snackbar';
import * as testUtils from 'misago/utils/test-utils';
let snackbarStore = null;
let apiResponse = {
"crop_tmp": false,
"galleries": [
{
"images": [
"avatars/Nature/arctic_fox.jpg",
"avatars/Nature/baby_fox.jpg",
"avatars/Nature/blackbird.jpg",
"avatars/Nature/rabbit.jpg",
"avatars/Nature/serval.jpg"
],
"name": "Nature"
},
{
"images": [
"avatars/Space/andromeda.jpg",
"avatars/Space/antennae_galaxies.jpg",
"avatars/Space/barred_spiral_galaxy.jpg",
"avatars/Space/messier_74.jpg",
"avatars/Space/ngc_1672.jpg",
"avatars/Space/ngc_4414.jpg"
],
"name": "Space"
}
],
"crop_org": false,
"upload": {
"allowed_extensions": [
".gif",
".png",
".jpg",
".jpeg"
],
"limit": 750000,
"allowed_mime_types": [
"image/gif",
"image/jpeg",
"image/png"
]
},
"generated": true,
"gravatar": true
};
describe("Change Avatar Gallery", function() {
beforeEach(function() {
snackbarStore = testUtils.snackbarStoreMock();
snackbar.init(snackbarStore);
misago._context = {
'user': {
'id': 123,
'avatar_hash': 'aabbccdd',
'api_url': {
'avatar': '/test-api/users/123/avatar/'
}
}
};
});
afterEach(function() {
testUtils.unmountComponents();
testUtils.snackbarClear(snackbar);
$.mockjax.clear();
});
it("renders", function(done) {
/* jshint ignore:start */
testUtils.render(
);
/* jshint ignore:end */
testUtils.onElement('#test-mount .modal-avatar-gallery', function() {
assert.ok(true, "component renders");
done();
});
});
it("handles backend rejection", function(done) {
$.mockjax({
url: '/test-api/users/123/avatar/',
status: 400,
responseText: {
detail: "Lol nope!"
}
});
snackbarStore.callback(function(message) {
assert.deepEqual(message, {
message: "Lol nope!",
type: 'error'
}, "error message was shown");
done();
});
let component = null;
/* jshint ignore:start */
component = testUtils.render(
);
/* jshint ignore:end */
testUtils.onElement('#test-mount .btn-avatar', function() {
testUtils.simulateClick('#test-mount .btn-avatar');
});
testUtils.onElement('#test-mount .avatar-selected', function() {
assert.equal(component.state.selection, "avatars/Nature/arctic_fox.jpg",
"avatar selection callback works");
testUtils.simulateClick('#test-mount .btn-primary');
});
});
it("handles backend error", function(done) { // jshint ignore:line
$.mockjax({
url: '/test-api/users/123/avatar/',
status: 403,
responseText: {
detail: "Avatar can't be changed at this time!"
}
});
snackbarStore.callback(function(message) {
assert.deepEqual(message, {
message: "Lol nope!",
type: 'error'
}, "error message was shown");
done();
});
let component = null;
/* jshint ignore:start */
let showError = function(error) {
assert.equal(error.detail, "Avatar can't be changed at this time!",
"callback was called with backend error message");
done()
};
component = testUtils.render(
);
/* jshint ignore:end */
testUtils.onElement('#test-mount .btn-avatar', function() {
testUtils.simulateClick('#test-mount .btn-avatar');
});
testUtils.onElement('#test-mount .avatar-selected', function() {
assert.equal(component.state.selection, "avatars/Nature/arctic_fox.jpg",
"avatar selection callback works");
testUtils.simulateClick('#test-mount .btn-primary');
});
});
it("selects and submits avatar", function(done) { // jshint ignore:line
$.mockjax({
url: '/test-api/users/123/avatar/',
status: 200,
responseText: {
detail: "Gallery avataru set!",
avatar_hash: 'n33wh44sh',
options: apiResponse
}
});
snackbarStore.callback(function(message) {
assert.deepEqual(message, {
message: "Gallery avataru set!",
type: 'success'
}, "valid message was shown");
});
let component = null;
/* jshint ignore:start */
let onComplete = function(avatarHash, options) {
assert.equal(avatarHash, 'n33wh44sh', "new hash was passed to callback");
assert.deepEqual(options, apiResponse, "new ops ware passed to callback");
done();
}
component = testUtils.render(
);
/* jshint ignore:end */
testUtils.onElement('#test-mount .btn-avatar', function() {
testUtils.simulateClick('#test-mount .btn-avatar');
});
testUtils.onElement('#test-mount .avatar-selected', function() {
assert.equal(component.state.selection, "avatars/Nature/arctic_fox.jpg",
"avatar selection callback works");
testUtils.simulateClick('#test-mount .btn-primary');
});
});
});
describe("Avatar Gallery", function() {
beforeEach(function() {
misago._context = {
MEDIA_URL: '/test-media/'
};
});
afterEach(function() {
testUtils.unmountComponents();
});
it("renders", function() {
/* jshint ignore:start */
testUtils.render(
);
/* jshint ignore:end */
let element = $('#test-mount .avatars-gallery');
assert.ok(element.length, "component renders");
assert.equal(element.find('h3').text().trim(), "Test gallery",
"gallery title is rendered");
apiResponse.galleries[0].images.forEach(function(i) {
assert.ok(element.find('button>img[src="/test-media/' + i + '"]').length,
"component contains image");
});
});
it("passess callback", function(done) { // jshint ignore:line
/* jshint ignore:start */
let select = function(image) {
assert.equal(image, "avatars/Nature/arctic_fox.jpg",
"callback was called with valid argument");
done();
};
testUtils.render(
);
/* jshint ignore:end */
testUtils.simulateClick("#test-mount button");
});
it("disables buttons", function() {
/* jshint ignore:start */
testUtils.render(
);
/* jshint ignore:end */
apiResponse.galleries[0].images.forEach(function(i) {
let image = $('#test-mount button>img[src="/test-media/' + i + '"]');
assert.ok(image.parent().attr('disabled'), "has disabled attr");
assert.ok(image.parent().hasClass('btn-disabled'), "has disabled class");
});
});
});
describe("Avatar Gallery Item", function() {
beforeEach(function() {
misago._context = {
MEDIA_URL: '/test-media/'
};
});
afterEach(function() {
testUtils.unmountComponents();
});
it("renders", function() {
/* jshint ignore:start */
testUtils.render(
);
/* jshint ignore:end */
let element = $('#test-mount button');
assert.ok(element.length, "component renders");
assert.ok(!element.hasClass('avatar-selected'), "item is not selected");
assert.equal(
element.find('img').attr('src'),
'/test-media/avatars/Nature/arctic_fox.jpg',
"component builds valid image url");
});
it("renders selected", function() {
/* jshint ignore:start */
testUtils.render(
);
/* jshint ignore:end */
let element = $('#test-mount button');
assert.ok(element.length, "component renders");
assert.ok(element.hasClass('avatar-selected'), "item is selected");
});
it("renders disabled", function() {
/* jshint ignore:start */
testUtils.render(
);
/* jshint ignore:end */
let element = $('#test-mount button');
assert.ok(element.length, "component renders");
assert.ok(element.attr('disabled'), "has disabled attr");
assert.ok(element.hasClass('btn-disabled'), "has disabled class");
assert.ok(element.hasClass('avatar-selected'), "item is selected");
});
it("executes callback", function(done) { // jshint ignore:line
/* jshint ignore:start */
let select = function(image) {
assert.equal(image, "avatars/Nature/arctic_fox.jpg",
"callback was called with valid argument");
done();
};
testUtils.render(
);
/* jshint ignore:end */
testUtils.simulateClick('#test-mount button');
});
});