forked from badges/shields
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.spec.js
138 lines (125 loc) · 4.15 KB
/
server.spec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
'use strict';
const { expect } = require('chai');
const config = require('./lib/test-config');
const fetch = require('node-fetch');
const fs = require('fs');
const isPng = require('is-png');
const isSvg = require('is-svg');
const path = require('path');
const serverHelpers = require('./lib/in-process-server-test-helpers');
const sinon = require('sinon');
const svg2img = require('./lib/svg-to-img');
describe('The server', function () {
const baseUri = `http://127.0.0.1:${config.port}`;
let server;
before('Start running the server', function () {
this.timeout(5000);
server = serverHelpers.start();
});
after('Shut down the server', function () { serverHelpers.stop(server); });
it('should produce colorscheme badges', function () {
// This is the first server test to run, and often times out.
this.timeout(5000);
return fetch(`${baseUri}/:fruit-apple-green.svg`)
.then(res => {
expect(res.ok).to.be.true;
return res.text();
}).then(text => {
expect(text)
.to.satisfy(isSvg)
.and.to.include('fruit')
.and.to.include('apple');
});
});
it('should produce colorscheme PNG badges', function () {
return fetch(`${baseUri}/:fruit-apple-green.png`)
.then(res => {
expect(res.ok).to.be.true;
return res.buffer();
}).then(data => {
expect(data).to.satisfy(isPng);
});
});
// https://github.com/badges/shields/pull/1319
it('should not crash with a numeric logo', function () {
return fetch(`${baseUri}/:fruit-apple-green.svg?logo=1`)
.then(res => {
expect(res.ok).to.be.true;
return res.text();
}).then(text => {
expect(text)
.to.satisfy(isSvg)
.and.to.include('fruit')
.and.to.include('apple');
});
});
it('should not crash with a numeric link', function () {
return fetch(`${baseUri}/:fruit-apple-green.svg?link=1`)
.then(res => {
expect(res.ok).to.be.true;
return res.text();
}).then(text => {
expect(text)
.to.satisfy(isSvg)
.and.to.include('fruit')
.and.to.include('apple');
});
});
it('should not crash with a boolean link', function () {
return fetch(`${baseUri}/:fruit-apple-green.svg?link=true`)
.then(res => {
expect(res.ok).to.be.true;
return res.text();
}).then(text => {
expect(text)
.to.satisfy(isSvg)
.and.to.include('fruit')
.and.to.include('apple');
});
});
context('with svg2img error', function () {
const expectedError = fs.readFileSync(path.resolve(__dirname, 'public', '500.html'));
let toBufferStub;
beforeEach(function () {
toBufferStub = sinon.stub(svg2img._imageMagick.prototype, 'toBuffer')
.callsArgWith(1, Error('whoops'));
});
afterEach(function () { toBufferStub.restore(); });
it('should emit the 500 message', function () {
return fetch(`${baseUri}/:some_new-badge-green.png`)
.then(res => {
// This emits status code 200, though 500 would be preferable.
expect(res.status).to.equal(200);
return res.text();
}).then(text => {
expect(text).to.include(expectedError);
});
});
});
describe('analytics endpoint', function () {
it('should return analytics in the expected format', function () {
return fetch(`${baseUri}/$analytics/v1`)
.then(res => {
expect(res.ok).to.be.true;
return res.json();
}).then(json => {
const expectedKeys = [
'vendorMonthly',
'rawMonthly',
'vendorFlatMonthly',
'rawFlatMonthly',
'vendorFlatSquareMonthly',
'rawFlatSquareMonthly',
];
expect(json).to.have.all.keys(...expectedKeys);
// TODO Switch this when we upgrade to Node 8.
// Object.values(json).forEach(stats => {
// expect(stats).to.be.an('array').with.length(36);
// });
Object.keys(json).forEach(k => {
expect(json[k]).to.be.an('array').with.length(36);
});
});
});
});
});