#
#  test_siteconfig.py
#
#    Tests for site config generation (siteconfig.py).
#
#  Copyright 2018 by
#  Nikhil Ramakrishnan.
#
#  This file is part of the FreeType project, and may only be used,
#  modified, and distributed under the terms of the FreeType project
#  license, LICENSE.TXT.  By continuing to use, modify, or distribute
#  this file you indicate that you have read the license and
#  understand and accept it fully.

"""Docwriter site config tests.

This module tests the validity of the `yml` configuration
generated by `siteconfig.py`.
"""
import os

import yaml

import siteconfig
import utils

config = siteconfig.SiteConfig()

# Config vars
site_name        = "Foo Bar Test"
site_description = "Test documentation for Foo Bar."
site_author      = "Pytest"
toc_filename     = "foo-toc.md"
index_filename   = "foo-index.md"

# Add chapters and pagess
c1_sec   = ["c1s1", "c1s2", "c1s3"]
c2_sec   = ["c2s1", "c2s2"]

pages = {}
pages['chap1'] = c1_sec
pages['chap2'] = c2_sec

def test_config( tmpdir, caplog ):
    utils.output_dir = str( tmpdir )
    # Set site config
    config.set_site_info( site_name, site_description,
                        site_author )
    # Add toc and index
    config.add_single_page( "TOC", toc_filename )
    config.add_single_page( "Index", index_filename )

    # Add chapters and pages
    for chap, parts in pages.items():
        config.start_chapter( chap )
        for sec in parts:
            config.add_chapter_page( sec, sec + ".md" )
        config.end_chapter()

    # Done, Build config
    config.build_config()

    # Open file and parse yml
    filepath = os.path.join( str( tmpdir ), 'mkdocs.yml' )
    result = open( filepath, 'rb' ).read()
    data = yaml.safe_load(result)

    # Assertions
    assert data is not None
    for record in caplog.records:
        # Strict build - there should be no warnings
        assert record.levelname != 'WARNING'
