~mwhudson/pydoctor/dev

« back to all changes in this revision

Viewing changes to pydoctor/test/test_sphinx.py

  • Committer: Michael Hudson-Doyle
  • Date: 2015-01-07 01:28:57 UTC
  • mfrom: (618.1.3 intersphinx-2015)
  • Revision ID: michael.hudson@canonical.com-20150107012857-q5r958xmzdgxk5jl
support generatings links based on intersphinx.

This is almost entirely Adi Roiban's work, which I have gracelessly
sat on for almost a year.  Sorry!

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
"""
4
4
from contextlib import closing
5
5
from StringIO import StringIO
 
6
import zlib
6
7
 
7
8
from pydoctor import model
8
9
from pydoctor.sphinx import SphinxInventory
199
200
        UnknownType('ignore-system', 'unknown1', 'ignore-docstring'))
200
201
 
201
202
    assert 'unknown1 py:obj -1 unknown1.html -\n' == result
 
203
 
 
204
 
 
205
def make_SphinxInventory():
 
206
    """
 
207
    Return a SphinxInventory.
 
208
    """
 
209
    return SphinxInventory(logger=object(), project_name='project_name')
 
210
 
 
211
 
 
212
def make_SphinxInventoryWithLog():
 
213
    """
 
214
    Return a SphinxInventory with patched log.
 
215
    """
 
216
    inventory = make_SphinxInventory()
 
217
    log = []
 
218
    inventory.msg = lambda part, msg: log.append((part, msg))
 
219
    return (inventory, log)
 
220
 
 
221
 
 
222
def test_getPayload_empty():
 
223
    """
 
224
    Return empty string.
 
225
    """
 
226
    sut = make_SphinxInventory()
 
227
    content = """# Sphinx inventory version 2
 
228
# Project: some-name
 
229
# Version: 2.0
 
230
# The rest of this file is compressed with zlib.
 
231
x\x9c\x03\x00\x00\x00\x00\x01"""
 
232
 
 
233
    result = sut._getPayload('http://base.ignore', content)
 
234
 
 
235
    assert '' == result
 
236
 
 
237
 
 
238
def test_getPayload_content():
 
239
    """
 
240
    Return content as string.
 
241
    """
 
242
    payload = 'first_line\nsecond line'
 
243
    sut = make_SphinxInventory()
 
244
    content = """# Ignored line
 
245
# Project: some-name
 
246
# Version: 2.0
 
247
# commented line.
 
248
%s""" % (zlib.compress(payload),)
 
249
 
 
250
    result = sut._getPayload('http://base.ignore', content)
 
251
 
 
252
    assert payload == result
 
253
 
 
254
 
 
255
def test_getPayload_invalid():
 
256
    """
 
257
    Return empty string and log an error when failing to uncompress data.
 
258
    """
 
259
    sut, log = make_SphinxInventoryWithLog()
 
260
    base_url = 'http://tm.tld'
 
261
    content = """# Project: some-name
 
262
# Version: 2.0
 
263
not-valid-zlib-content"""
 
264
 
 
265
    result = sut._getPayload(base_url, content)
 
266
 
 
267
    assert '' == result
 
268
    assert [(
 
269
        'sphinx', 'Failed to uncompress inventory from http://tm.tld',
 
270
        )] == log
 
271
 
 
272
 
 
273
def test_getLink_not_found():
 
274
    """
 
275
    Return None if link does not exists.
 
276
    """
 
277
    sut = make_SphinxInventory()
 
278
 
 
279
    assert None is sut.getLink('no.such.name')
 
280
 
 
281
 
 
282
def test_getLink_found():
 
283
    """
 
284
    Return the link from internal state.
 
285
    """
 
286
    sut = make_SphinxInventory()
 
287
    sut._links['some.name'] = ('http://base.tld', 'some/url.php')
 
288
 
 
289
    assert 'http://base.tld/some/url.php' == sut.getLink('some.name')
 
290
 
 
291
 
 
292
def test_getLink_self_anchor():
 
293
    """
 
294
    Return the link with anchor as target name when link end with $.
 
295
    """
 
296
    sut = make_SphinxInventory()
 
297
    sut._links['some.name'] = ('http://base.tld', 'some/url.php#$')
 
298
 
 
299
    assert 'http://base.tld/some/url.php#some.name' == sut.getLink('some.name')
 
300
 
 
301
 
 
302
def test_update_functional():
 
303
    """
 
304
    Functional test for updating from an empty inventory.
 
305
    """
 
306
    payload = (
 
307
        'some.module1 py:module -1 module1.html -\n'
 
308
        'other.module2 py:module 0 module2.html Other description\n'
 
309
        )
 
310
    sut = make_SphinxInventory()
 
311
    # Patch URL loader to avoid hitting the system.
 
312
    content = """# Sphinx inventory version 2
 
313
# Project: some-name
 
314
# Version: 2.0
 
315
# The rest of this file is compressed with zlib.
 
316
%s""" % (zlib.compress(payload),)
 
317
    sut._getURL = lambda _: content
 
318
 
 
319
    sut.update('http://some.url/api/objects.inv')
 
320
 
 
321
    assert 'http://some.url/api/module1.html' == sut.getLink('some.module1')
 
322
    assert 'http://some.url/api/module2.html' == sut.getLink('other.module2')
 
323
 
 
324
 
 
325
def test_update_bad_url():
 
326
    """
 
327
    Log an error when failing to get base url from url.
 
328
    """
 
329
    sut, log = make_SphinxInventoryWithLog()
 
330
 
 
331
    sut.update('really.bad.url')
 
332
 
 
333
    assert sut._links == {}
 
334
    expected_log = [(
 
335
        'sphinx', 'Failed to get remote base url for really.bad.url'
 
336
        )]
 
337
    assert expected_log == log
 
338
 
 
339
 
 
340
def test_update_fail():
 
341
    """
 
342
    Log an error when failing to get content from url.
 
343
    """
 
344
    sut, log = make_SphinxInventoryWithLog()
 
345
    sut._getURL = lambda _: None
 
346
 
 
347
    sut.update('http://some.tld/o.inv')
 
348
 
 
349
    assert sut._links == {}
 
350
    expected_log = [(
 
351
        'sphinx', 'Failed to get object inventory from http://some.tld/o.inv'
 
352
        )]
 
353
    assert expected_log == log
 
354
 
 
355
 
 
356
def test_parseInventory_empty():
 
357
    """
 
358
    Return empty dict for empty input.
 
359
    """
 
360
    sut = make_SphinxInventory()
 
361
 
 
362
    result = sut._parseInventory('http://base.tld', '')
 
363
 
 
364
    assert {} == result
 
365
 
 
366
 
 
367
def test_parseInventory_single_line():
 
368
    """
 
369
    Return a dict with a single member.
 
370
    """
 
371
    sut = make_SphinxInventory()
 
372
 
 
373
    result = sut._parseInventory(
 
374
        'http://base.tld', 'some.attr py:attr -1 some.html De scription')
 
375
 
 
376
    assert {'some.attr': ('http://base.tld', 'some.html')} == result
 
377
 
 
378
 
 
379
def test_parseInventory_invalid_lines():
 
380
    """
 
381
    Skip line and log an error.
 
382
    """
 
383
    sut, log = make_SphinxInventoryWithLog()
 
384
    base_url = 'http://tm.tld'
 
385
    content = (
 
386
        'good.attr py:attribute -1 some.html -\n'
 
387
        'bad.attr bad format\n'
 
388
        'very.bad\n'
 
389
        '\n'
 
390
        'good.again py:module 0 again.html -\n'
 
391
        )
 
392
 
 
393
    result = sut._parseInventory(base_url, content)
 
394
 
 
395
    assert {
 
396
        'good.attr': (base_url, 'some.html'),
 
397
        'good.again': (base_url, 'again.html'),
 
398
        } == result
 
399
    assert [
 
400
        (
 
401
            'sphinx',
 
402
            'Failed to parse line "bad.attr bad format" for http://tm.tld'
 
403
            ),
 
404
        ('sphinx', 'Failed to parse line "very.bad" for http://tm.tld'),
 
405
        ('sphinx', 'Failed to parse line "" for http://tm.tld'),
 
406
        ] == log