#!/usr/bin/python
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unittests for deploy_production_local.py."""

from __future__ import print_function

import unittest

import deploy_production as deploy_production


class TestDeployProduction(unittest.TestCase):
    """Test deploy_production_local with commands mocked out."""

    def test_parse_arguments(self):
        """Test deploy_production_local.parse_arguments."""
        # No arguments.
        results = deploy_production.parse_arguments([])
        self.assertEqual(
                {'afe': 'cautotest', 'servers': [], 'args': [],
                 'cont': False, 'dryrun': False},
                vars(results))

        # Dryrun, continue
        results = deploy_production.parse_arguments(['--dryrun', '--continue'])
        self.assertDictContainsSubset(
                {'afe': 'cautotest', 'servers': [], 'args': [],
                 'cont': True, 'dryrun': True},
                vars(results))

        # List custom AFE server.
        results = deploy_production.parse_arguments(['--afe', 'foo'])
        self.assertDictContainsSubset(
                {'afe': 'foo', 'servers': [], 'args': [],
                 'cont': False, 'dryrun': False},
                vars(results))

        # List some servers
        results = deploy_production.parse_arguments(['foo', 'bar'])
        self.assertDictContainsSubset(
                {'afe': 'cautotest', 'servers': ['foo', 'bar'], 'args': [],
                 'cont': False, 'dryrun': False},
                vars(results))

        # List some local args
        results = deploy_production.parse_arguments(['--', 'foo', 'bar'])
        self.assertDictContainsSubset(
                {'afe': 'cautotest', 'servers': [], 'args': ['foo', 'bar'],
                 'cont': False, 'dryrun': False},
                vars(results))

        # List everything.
        results = deploy_production.parse_arguments(
                ['--continue', '--afe', 'foo', '--dryrun', 'foo', 'bar',
                 '--', '--actions-only', '--dryrun'])
        self.assertDictContainsSubset(
                {'afe': 'foo', 'servers': ['foo', 'bar'],
                 'args': ['--actions-only', '--dryrun'],
                 'cont': True, 'dryrun': True},
                vars(results))


if __name__ == '__main__':
    unittest.main()
