"""Test aggregation of config files and command-line options."""
import argparse
import os

import pytest

from flake8.main import options
from flake8.options import aggregator
from flake8.options import config
from flake8.options import manager

CLI_SPECIFIED_CONFIG = "tests/fixtures/config_files/cli-specified.ini"


@pytest.fixture
def optmanager():
    """Create a new OptionManager."""
    prelim_parser = argparse.ArgumentParser(add_help=False)
    options.register_preliminary_options(prelim_parser)
    option_manager = manager.OptionManager(
        prog="flake8",
        version="3.0.0",
        parents=[prelim_parser],
    )
    options.register_default_options(option_manager)
    return option_manager


def test_aggregate_options_with_config(optmanager):
    """Verify we aggregate options and config values appropriately."""
    arguments = [
        "flake8",
        "--select",
        "E11,E34,E402,W,F",
        "--exclude",
        "tests/*",
    ]
    config_finder = config.ConfigFileFinder(
        "flake8", config_file=CLI_SPECIFIED_CONFIG
    )
    options, args = aggregator.aggregate_options(
        optmanager, config_finder, arguments
    )

    assert options.select == ["E11", "E34", "E402", "W", "F"]
    assert options.ignore == ["E123", "W234", "E111"]
    assert options.exclude == [os.path.abspath("tests/*")]


def test_aggregate_options_when_isolated(optmanager):
    """Verify we aggregate options and config values appropriately."""
    arguments = [
        "flake8",
        "--select",
        "E11,E34,E402,W,F",
        "--exclude",
        "tests/*",
    ]
    config_finder = config.ConfigFileFinder("flake8", ignore_config_files=True)
    optmanager.extend_default_ignore(["E8"])
    options, args = aggregator.aggregate_options(
        optmanager, config_finder, arguments
    )

    assert options.select == ["E11", "E34", "E402", "W", "F"]
    assert sorted(options.ignore) == [
        "E121",
        "E123",
        "E126",
        "E226",
        "E24",
        "E704",
        "E8",
        "W503",
        "W504",
    ]
    assert options.exclude == [os.path.abspath("tests/*")]
