You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mercury-parser/src/extractors/generic/lead-image-url/score-image.test.js

225 lines
4.9 KiB
JavaScript

import assert from 'assert';
import cheerio from 'cheerio';
import {
scoreImageUrl,
scoreAttr,
scoreByParents,
scoreBySibling,
scoreByDimensions,
scoreByPosition,
} from './score-image';
describe('scoreImageUrlUrl(url)', () => {
it('gets 20 points for a positive lead img hint', () => {
const url = 'http://example.com/upload/img.png';
assert.equal(scoreImageUrl(url), 20);
});
it('loses 20 points for a negative lead img hint', () => {
const url = 'http://example.com/sprite/foo/bar.png';
assert.equal(scoreImageUrl(url), -20);
});
it('loses 10 points for a gif', () => {
const url = 'http://example.com/foo/bar.gif';
assert.equal(scoreImageUrl(url), -10);
const url2 = 'http://example.com/foogif/bar';
assert.equal(scoreImageUrl(url2), 0);
});
it('gains 10 points for a jpg', () => {
const url = 'http://example.com/foo/bar.jpg';
assert.equal(scoreImageUrl(url), 10);
const url2 = 'http://example.com/foo/bar.jpeg';
assert.equal(scoreImageUrl(url2), 10);
const url3 = 'http://example.com/foojpg/bar';
assert.equal(scoreImageUrl(url3), 0);
const url4 = 'http://example.com/foo.jpg?bar=baz';
assert.equal(scoreImageUrl(url4), 10);
});
});
describe('scoreAttr($img)', () => {
it('gets 5 points if the img node has an alt attribute', () => {
const $ = cheerio.load('<div><img alt="Wow" /></div>');
const $img = $('img').first();
assert.equal(scoreAttr($img), 5);
});
it('gets 0 points if the img node has an alt attribute', () => {
const $ = cheerio.load('<div><img /></div>');
const $img = $('img').first();
assert.equal(scoreAttr($img), 0);
});
});
describe('scoreByParents($img)', () => {
it('gets 25 points if it has a figure parent', () => {
const $ = cheerio.load(
`<div>
<figure>
<div>
<img alt="Wow" />
</div>
</figure>
</div>`
);
const $img = $('img').first();
assert.equal(scoreByParents($img), 25);
});
it('gets 0 points if the img has no figure parent', () => {
const $ = cheerio.load('<div><img /></div>');
const $img = $('img').first();
assert.equal(scoreByParents($img), 0);
});
it('gets 15 points if parent or gparent has photo hints', () => {
const $ = cheerio.load(
`<div>
<div class="figure">
<div>
<img alt="Wow" />
</div>
</div>
</div>`
);
const $img = $('img').first();
assert.equal(scoreByParents($img), 15);
});
});
describe('scoreBySibling($img)', () => {
it('gets 25 points if its sibling is figcaption', () => {
const $ = cheerio.load(
`
<div>
<img />
<figcaption>Wow</figcaption>
</div>
`
);
const $img = $('img').first();
assert.equal(scoreBySibling($img), 25);
});
it('gets 15 points if its sibling has photo hints', () => {
const $ = cheerio.load(
`<div>
<div>
<img alt="Wow" />
<div class="caption">
Wow
</div>
</div>
</div>`
);
const $img = $('img').first();
assert.equal(scoreBySibling($img), 15);
});
});
describe('scoreByDimensions($img)', () => {
it('penalizes skinny images', () => {
const $ = cheerio.load(
`
<div>
<img width="10" />
</div>
`
);
const $img = $('img').first();
assert.equal(scoreByDimensions($img), -50);
});
it('penalizes short images', () => {
const $ = cheerio.load(
`
<div>
<img height="10" />
</div>
`
);
const $img = $('img').first();
assert.equal(scoreByDimensions($img), -50);
});
it('ignores sprites', () => {
const $ = cheerio.load(
`
<div>
<img src="/sprite/etc/foo.png" width="1000" height="1000" />
</div>
`
);
const $img = $('img').first();
assert.equal(scoreByDimensions($img), 0);
});
it('penalizes images with small areas', () => {
const $ = cheerio.load(
`
<div>
<img src="/etc/foo.png" width="60" height="60" />
</div>
`
);
const $img = $('img').first();
assert.equal(scoreByDimensions($img), -100);
});
it('prefers the largest images', () => {
const $ = cheerio.load(
`
<div>
<img src="/etc/foo.png" width="1000" height="1000" />
</div>
`
);
const $img = $('img').first();
assert.equal(scoreByDimensions($img), 1000);
});
});
describe('scoreByPosition($imgs, index)', () => {
it('gives higher scores to images that come first', () => {
const $ = cheerio.load(
`
<div>
<img width="10" />
<img width="10" />
<img width="10" />
<img width="10" />
<img width="10" />
<img width="10" />
</div>
`
);
const $imgs = $('img');
assert.equal(scoreByPosition($imgs, 0), 3);
});
});