def test___init___(self):
        vagrantfile_string = load_vagrant_file('default-shell')
        vagrantfile = VagrantParser.parses(content=vagrantfile_string)
        self.assertIsInstance(vagrantfile, Vagrantfile)

        vagrantfile_path = get_vagrant_file_path('default-shell')
        vagrantfile = VagrantParser.parsep(path=vagrantfile_path)
        self.assertIsInstance(vagrantfile, Vagrantfile)

        self.assertEqual(vagrantfile.configure_version, '2')
    def test_chef_provisioner2(self):
        vagrantfile_string = load_vagrant_file('default-chef2')
        vagrantfile = VagrantParser.parses(content=vagrantfile_string)

        provisioner = vagrantfile.vm.provision

        self.assertKeyInDict('chef_solo', provisioner)
        chef_solo = provisioner['chef_solo']

        self.assertHasAttr(chef_solo, 'cookbooks_path')
        self.assertListEqual(chef_solo.cookbooks_path, ['cookbooks', 'site-cookbooks'])

        self.assertHasAttr(chef_solo, 'json')
        self.assertDictEqual(chef_solo.json, {
            'ncpackageserver': {
                'nginx_port': 8080,
                'authentication': {
                    'htpasswd': 'auth/htpasswd_devpi',
                    'users': [{
                        'name': 'drewsonne',
                        'password': '******'
                    }]
                }
            }
        })

        self.assertHasAttr(chef_solo, 'run_list')
        self.assertListEqual(chef_solo.run_list, [
            'recipe[devpi::server]',
            'recipe[ncpackageserver::web]',
            'recipe[ncpackageserver::nginx]',
            'recipe[ncpackageserver::server]'
        ])
    def test_chef_provisioner(self):
        vagrantfile_string = load_vagrant_file('default-chef')
        vagrantfile = VagrantParser.parses(content=vagrantfile_string)

        provisioner = vagrantfile.vm.provision

        self.assertKeyInDict('chef_solo', provisioner)
        chef_solo = provisioner['chef_solo']

        self.assertHasAttr(chef_solo, 'cookbooks_path')
        self.assertListEqual(chef_solo.cookbooks_path, ['cookbooks', 'my_cookbooks'])

        self.assertHasAttr(chef_solo, 'data_bags_path')
        self.assertEqual(chef_solo.data_bags_path, 'data_bags')

        self.assertHasAttr(chef_solo, 'roles_path')
        self.assertEqual(chef_solo.roles_path, 'roles')

        self.assertHasAttr(chef_solo, 'roles')
        self.assertListEqual(chef_solo.roles, ['web', 'database'])

        self.assertHasAttr(chef_solo, 'cookbooks_path')
        self.assertListEqual(chef_solo.cookbooks_path, ['cookbooks', 'my_cookbooks'])

        self.assertHasAttr(chef_solo, 'json')
        self.assertDictEqual(chef_solo.json, {
            'apache': {
                'listen_address': '0.0.0.0',
                'modules': ['mod_sec', 'mod_php', 'mod_cgi', 'mod_java']
            }
        })

        self.assertHasAttr(chef_solo, 'recipes')
        self.assertListEqual(chef_solo.recipes, ['apache', 'mysql'])
    def test_parse_ruby_dict_malformed(self):
        parser = VagrantParser(content='')
        parser.current_position = 0
        ruby_dict = parser.parse_ruby_dict("""
      "apache" => {
        "listen_address" => "0.0.0.0",
        "modules" => ["mod_sec", "mod_php", "mod_cgi", "mod_java"]
      }
    }""")

        self.assertDictEqual(ruby_dict, {
            'apache': {
                'listen_address': '0.0.0.0',
                'modules': ['mod_sec', 'mod_php', 'mod_cgi', 'mod_java']
            }
        })
    def test_provisioner_shell(self):
        vagrantfile_path = get_vagrant_file_path('default-shell')
        vagrantfile = VagrantParser.parsep(path=vagrantfile_path)

        self.assertHasAttr(vagrantfile.vm, 'provision')
        provision = vagrantfile.vm.provision

        self.assertKeyInDict('shell', provision)

        self.assertHasAttr(provision['shell'], 'inline')
        self.assertEqual(provision['shell'].inline, "sudo apt-get update\n"
                                                    "sudo apt-get install -y apache2")
    def test_vm_attributes(self):
        vagrantfile_path = get_vagrant_file_path('default-shell')
        vagrantfile = VagrantParser.parsep(path=vagrantfile_path)

        self.assertHasAttr(vagrantfile, 'vm')
        vm = vagrantfile.vm

        self.assertHasAttr(vm, 'box')
        self.assertEqual(vm.box, 'base')

        self.assertHasAttr(vm, 'box_check_update')
        self.assertEqual(vm.box_check_update, False)
    def test_provider_virtualbox(self):
        vagrantfile_path = get_vagrant_file_path('default-shell')
        vagrantfile = VagrantParser.parsep(path=vagrantfile_path)

        self.assertHasAttr(vagrantfile.vm, 'provider')
        self.assertKeyInDict('virtualbox', vagrantfile.vm.provider)
        vb = vagrantfile.vm.provider['virtualbox']

        self.assertHasAttr(vb, 'gui')
        self.assertTrue(vb.gui, True)

        self.assertHasAttr(vb, 'memory')
        self.assertTrue(vb.memory, '1024')
    def test_to_dict(self):
        vagrantfile_string = load_vagrant_file('default-chef')
        vagrantfile = VagrantParser.parses(content=vagrantfile_string)

        self.assertDictEqual(
            vagrantfile.to_dict(), {
                'vm': {
                    'box': 'base',
                    'box_check_update': False,
                    'provision': {
                        'shell': {
                            'inline':
                            'sudo apt-get update\nsudo apt-get install -y apache2'
                        },
                        'chef_solo': {
                            'data_bags_path': 'data_bags',
                            'roles_path': 'roles',
                            'roles': ['web', 'database'],
                            'recipes': ['apache', 'mysql'],
                            'cookbooks_path': ['cookbooks', 'my_cookbooks'],
                            'json': {
                                'apache': {
                                    'listen_address':
                                    '0.0.0.0',
                                    'modules': [
                                        'mod_sec', 'mod_php', 'mod_cgi',
                                        'mod_java'
                                    ]
                                }
                            }
                        }
                    },
                    'network': {
                        'forwarded_port': [{
                            'host': 8080,
                            'guest': 80
                        }],
                        'private_network': {
                            'ip': '192.168.33.10'
                        },
                        'public_network': True
                    },
                    'provider': {
                        'virtualbox': {
                            'gui': True,
                            'memory': '1024'
                        }
                    }
                }
            })
    def test_to_dict(self):
        vagrantfile_string = load_vagrant_file('default-chef')
        vagrantfile = VagrantParser.parses(content=vagrantfile_string)

        self.assertDictEqual(vagrantfile.to_dict(), {
            'vm': {
                'box': 'base',
                'box_check_update': False,
                'provision': {
                    'shell': {
                        'inline': 'sudo apt-get update\nsudo apt-get install -y apache2'
                    },
                    'chef_solo': {
                        'data_bags_path': 'data_bags',
                        'roles_path': 'roles',
                        'roles': ['web', 'database'],
                        'recipes': ['apache', 'mysql'],
                        'cookbooks_path': ['cookbooks', 'my_cookbooks'],
                        'json': {
                            'apache': {
                                'listen_address': '0.0.0.0',
                                'modules': ['mod_sec', 'mod_php', 'mod_cgi', 'mod_java']
                            }
                        }
                    }
                },
                'network': {
                    'forwarded_port': [{
                        'host': 8080,
                        'guest': 80
                    }],
                    'private_network': {
                        'ip': '192.168.33.10'
                    },
                    'public_network': True
                },
                'provider': {
                    'virtualbox': {
                        'gui': True,
                        'memory': '1024'
                    }
                }
            }
        })
    def test_chef_provisioner(self):
        vagrantfile_string = load_vagrant_file('default-chef')
        vagrantfile = VagrantParser.parses(content=vagrantfile_string)

        provisioner = vagrantfile.vm.provision

        self.assertKeyInDict('chef_solo', provisioner)
        chef_solo = provisioner['chef_solo']

        self.assertHasAttr(chef_solo, 'cookbooks_path')
        self.assertListEqual(chef_solo.cookbooks_path,
                             ['cookbooks', 'my_cookbooks'])

        self.assertHasAttr(chef_solo, 'data_bags_path')
        self.assertEqual(chef_solo.data_bags_path, 'data_bags')

        self.assertHasAttr(chef_solo, 'roles_path')
        self.assertEqual(chef_solo.roles_path, 'roles')

        self.assertHasAttr(chef_solo, 'roles')
        self.assertListEqual(chef_solo.roles, ['web', 'database'])

        self.assertHasAttr(chef_solo, 'cookbooks_path')
        self.assertListEqual(chef_solo.cookbooks_path,
                             ['cookbooks', 'my_cookbooks'])

        self.assertHasAttr(chef_solo, 'json')
        self.assertDictEqual(
            chef_solo.json, {
                'apache': {
                    'listen_address': '0.0.0.0',
                    'modules': ['mod_sec', 'mod_php', 'mod_cgi', 'mod_java']
                }
            })

        self.assertHasAttr(chef_solo, 'recipes')
        self.assertListEqual(chef_solo.recipes, ['apache', 'mysql'])
    def test_network_attributes(self):
        vagrantfile_path = get_vagrant_file_path('default-shell')
        vagrantfile = VagrantParser.parsep(path=vagrantfile_path)

        self.assertHasAttr(vagrantfile.vm, 'network')
        network = vagrantfile.vm.network

        self.assertKeyInDict('forwarded_port', network)
        self.assertIsInstance(network['forwarded_port'], list)
        self.assertGreater(len(network['forwarded_port']), 0)

        self.assertHasAttr(network['forwarded_port'][0], 'guest')
        self.assertEqual(network['forwarded_port'][0].guest, 80)

        self.assertHasAttr(network['forwarded_port'][0], 'host')
        self.assertEqual(network['forwarded_port'][0].host, 8080)

        self.assertKeyInDict('private_network', network)

        self.assertHasAttr(network['private_network'], 'ip')
        self.assertEqual(network['private_network'].ip, '192.168.33.10')

        self.assertKeyInDict('public_network', network)
        self.assertTrue(network['public_network'])
    def test_network_attributes(self):
        vagrantfile_path = get_vagrant_file_path('default-shell')
        vagrantfile = VagrantParser.parsep(path=vagrantfile_path)

        self.assertHasAttr(vagrantfile.vm, 'network')
        network = vagrantfile.vm.network

        self.assertKeyInDict('forwarded_port', network)
        self.assertIsInstance(network['forwarded_port'], list)
        self.assertGreater(len(network['forwarded_port']), 0)

        self.assertHasAttr(network['forwarded_port'][0], 'guest')
        self.assertEqual(network['forwarded_port'][0].guest, 80)

        self.assertHasAttr(network['forwarded_port'][0], 'host')
        self.assertEqual(network['forwarded_port'][0].host, 8080)

        self.assertKeyInDict('private_network', network)

        self.assertHasAttr(network['private_network'], 'ip')
        self.assertEqual(network['private_network'].ip, '192.168.33.10')

        self.assertKeyInDict('public_network', network)
        self.assertTrue(network['public_network'])
    def test_synced_folder(self):
        vagrantfile_path = get_vagrant_file_path('default-shell')
        vagrantfile = VagrantParser.parsep(path=vagrantfile_path)

        self.assertHasAttr(vagrantfile.vm, 'synced_folder')
        self.assertTupleEqual(vagrantfile.vm.synced_folder, ('../data', '/vagrant_data'))