"""Tests for distutils.command.register."""

import sys

import os

import unittest



from distutils.command.register import register

from distutils.core import Distribution



from distutils.tests import support

from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase



class RawInputs(object):

    """Fakes user inputs."""

    def __init__(self, *answers):

        self.answers = answers

        self.index = 0



    def __call__(self, prompt=''):

        try:

            return self.answers[self.index]

        finally:

            self.index += 1



WANTED_PYPIRC = """\

[distutils]

index-servers =

    pypi



[pypi]

username:tarek

password:xxx

"""



class registerTestCase(PyPIRCCommandTestCase):



    def test_create_pypirc(self):

        # this test makes sure a .pypirc file

        # is created when requested.



        # let's create a fake distribution

        # and a register instance

        dist = Distribution()

        dist.metadata.url = 'xxx'

        dist.metadata.author = 'xxx'

        dist.metadata.author_email = 'xxx'

        dist.metadata.name = 'xxx'

        dist.metadata.version =  'xxx'

        cmd = register(dist)



        # we shouldn't have a .pypirc file yet

        self.assert_(not os.path.exists(self.rc))



        # patching raw_input and getpass.getpass

        # so register gets happy

        #

        # Here's what we are faking :

        # use your existing login (choice 1.)

        # Username : 'tarek'

        # Password : 'xxx'

        # Save your login (y/N)? : 'y'

        inputs = RawInputs('1', 'tarek', 'y')

        from distutils.command import register as register_module

        register_module.raw_input = inputs.__call__

        def _getpass(prompt):

            return 'xxx'

        register_module.getpass.getpass = _getpass

        class FakeServer(object):

            def __init__(self):

                self.calls = []



            def __call__(self, *args):

                # we want to compare them, so let's store

                # something comparable

                els = args[0].items()

                els.sort()

                self.calls.append(tuple(els))

                return 200, 'OK'



        cmd.post_to_server = pypi_server = FakeServer()



        # let's run the command

        cmd.run()



        # we should have a brand new .pypirc file

        self.assert_(os.path.exists(self.rc))



        # with the content similar to WANTED_PYPIRC

        content = open(self.rc).read()

        self.assertEquals(content, WANTED_PYPIRC)



        # now let's make sure the .pypirc file generated

        # really works : we shouldn't be asked anything

        # if we run the command again

        def _no_way(prompt=''):

            raise AssertionError(prompt)

        register_module.raw_input = _no_way



        cmd.run()



        # let's see what the server received : we should

        # have 2 similar requests

        self.assert_(len(pypi_server.calls), 2)

        self.assert_(pypi_server.calls[0], pypi_server.calls[1])



def test_suite():

    return unittest.makeSuite(registerTestCase)



if __name__ == "__main__":

    unittest.main(defaultTest="test_suite")

