def setUp(self):
     super(LaunchpadTargetWidgetTestCase, self).setUp()
     self.distribution, self.package = self.factory.makeDSPCache(
         distro_name='fnord', package_name='snarf')
     self.project = self.factory.makeProduct('pting')
     field = Reference(__name__='target', schema=Interface, title=u'target')
     field = field.bind(Thing())
     request = LaunchpadTestRequest()
     self.widget = LaunchpadTargetWidget(field, request)
 def setUp(self):
     super(LaunchpadTargetWidgetTestCase, self).setUp()
     self.distribution, self.package = self.factory.makeDSPCache(
         distro_name='fnord', package_name='snarf')
     self.project = self.factory.makeProduct('pting')
     field = Reference(
         __name__='target', schema=Interface, title=u'target')
     field = field.bind(Thing())
     request = LaunchpadTestRequest()
     self.widget = LaunchpadTargetWidget(field, request)
예제 #3
0
class LaunchpadTargetWidgetTestCase(TestCaseWithFactory):
    """Test the LaunchpadTargetWidget class."""

    layer = DatabaseFunctionalLayer

    @property
    def form(self):
        return {
        'field.target': 'package',
        'field.target.distribution': 'fnord',
        'field.target.package': 'snarf',
        'field.target.product': 'pting',
        }

    def setUp(self):
        super(LaunchpadTargetWidgetTestCase, self).setUp()
        self.distribution = self.factory.makeDistribution(name='fnord')
        distroseries = self.factory.makeDistroSeries(
            distribution=self.distribution)
        self.package = self.factory.makeDSPCache(
            distroseries=distroseries, sourcepackagename='snarf')
        self.project = self.factory.makeProduct('pting')
        field = Reference(
            __name__='target', schema=Interface, title=u'target')
        field = field.bind(Thing())
        request = LaunchpadTestRequest()
        self.widget = LaunchpadTargetWidget(field, request)

    def test_implements(self):
        self.assertTrue(verifyObject(IBrowserWidget, self.widget))
        self.assertTrue(verifyObject(IInputWidget, self.widget))

    def test_template(self):
        # The render template is setup.
        self.assertTrue(
            self.widget.template.filename.endswith('launchpad-target.pt'),
            'Template was not set up.')

    def test_default_option(self):
        # This package field is the default option.
        self.assertEqual('package', self.widget.default_option)

    def test_getDistributionVocabulary(self):
        # The vocabulary is always "Distribution".
        self.assertEqual(
            'Distribution', self.widget.getDistributionVocabulary())

    def test_hasInput_false(self):
        # hasInput is false when the widget's name is not in the form data.
        self.widget.request = LaunchpadTestRequest(form={})
        self.assertEqual('field.target', self.widget.name)
        self.assertFalse(self.widget.hasInput())

    def test_hasInput_true(self):
        # hasInput is true is the widget's name in the form data.
        self.widget.request = LaunchpadTestRequest(form=self.form)
        self.assertEqual('field.target', self.widget.name)
        self.assertTrue(self.widget.hasInput())

    def test_setUpSubWidgets_first_call(self):
        # The subwidgets are setup and a flag is set.
        self.widget.setUpSubWidgets()
        self.assertTrue(self.widget._widgets_set_up)
        self.assertIsInstance(
            self.widget.distribution_widget.context.vocabulary,
            DistributionVocabulary)
        self.assertIsInstance(
            self.widget.package_widget.context.vocabulary,
            BinaryAndSourcePackageNameVocabulary)
        self.assertIsInstance(
            self.widget.product_widget.context.vocabulary,
            ProductVocabulary)

    def test_setUpSubWidgets_second_call(self):
        # The setUpSubWidgets method exits early if a flag is set to
        # indicate that the widgets were setup.
        self.widget._widgets_set_up = True
        self.widget.setUpSubWidgets()
        self.assertIs(None, getattr(self.widget, 'distribution_widget', None))
        self.assertIs(None, getattr(self.widget, 'package_widget', None))
        self.assertIs(None, getattr(self.widget, 'product_widget', None))

    def test_setUpSubWidgets_dsp_picker_feature_flag(self):
        # The DistributionSourcePackageVocabulary is used when the
        # disclosure.dsp_picker.enabled is true.
        with FeatureFixture({u"disclosure.dsp_picker.enabled": u"on"}):
            self.widget.setUpSubWidgets()
        self.assertIsInstance(
            self.widget.package_widget.context.vocabulary,
            DistributionSourcePackageVocabulary)

    def test_setUpOptions_default_package_checked(self):
        # The radio button options are composed of the setup widgets with
        # the package widget set as the default.
        self.widget.setUpSubWidgets()
        self.widget.setUpOptions()
        self.assertEqual(
            "selectWidget('field.target.option.package', event)",
            self.widget.package_widget.onKeyPress)
        self.assertEqual(
            "selectWidget('field.target.option.product', event)",
            self.widget.product_widget.onKeyPress)
        self.assertEqual(
            '<input class="radioType" checked="checked" '
            'id="field.target.option.package" name="field.target" '
            'type="radio" value="package" />',
            self.widget.options['package'])
        self.assertEqual(
            '<input class="radioType" '
            'id="field.target.option.product" name="field.target" '
            'type="radio" value="product" />',
            self.widget.options['product'])

    def test_setUpOptions_product_checked(self):
        # The product radio button is selected when the form is submitted
        # when the target field's value is 'product'.
        form = {
            'field.target': 'product',
            }
        self.widget.request = LaunchpadTestRequest(form=form)
        self.widget.setUpSubWidgets()
        self.widget.setUpOptions()
        self.assertEqual(
            '<input class="radioType" '
            'id="field.target.option.package" name="field.target" '
            'type="radio" value="package" />',
            self.widget.options['package'])
        self.assertEqual(
            '<input class="radioType" checked="checked" '
            'id="field.target.option.product" name="field.target" '
            'type="radio" value="product" />',
            self.widget.options['product'])

    def test_hasValidInput_true(self):
        # The field input is valid when all submitted parts are valid.
        self.widget.request = LaunchpadTestRequest(form=self.form)
        self.assertTrue(self.widget.hasValidInput())

    def test_hasValidInput_false(self):
        # The field input is invalid if any of the submitted parts are
        # invalid.
        form = self.form
        form['field.target.package'] = 'non-existent'
        self.widget.request = LaunchpadTestRequest(form=form)
        self.assertFalse(self.widget.hasValidInput())

    def test_getInputValue_package_spn(self):
        # The field value is the package when the package radio button
        # is selected and the package sub field has official spn.
        self.widget.request = LaunchpadTestRequest(form=self.form)
        self.assertEqual(self.package, self.widget.getInputValue())

    def test_getInputValue_package_dsp_dsp_picker_feature_flag(self):
        # The field value is the package when the package radio button
        # is selected and the package sub field has valid input.
        self.widget.request = LaunchpadTestRequest(form=self.form)
        with FeatureFixture({u"disclosure.dsp_picker.enabled": u"on"}):
            self.widget.setUpSubWidgets()
            self.assertEqual(self.package, self.widget.getInputValue())

    def test_getInputValue_package_invalid(self):
        # An error is raised when the package is not published in the distro.
        form = self.form
        form['field.target.package'] = 'non-existent'
        self.widget.request = LaunchpadTestRequest(form=form)
        message = (
            "There is no package named 'non-existent' published in Fnord.")
        e = self.assertRaises(WidgetInputError, self.widget.getInputValue)
        self.assertEqual(LaunchpadValidationError(message), e.errors)
        self.assertEqual(html_escape(message), self.widget.error())

    def test_getInputValue_distribution(self):
        # The field value is the distribution when the package radio button
        # is selected and the package sub field empty.
        form = self.form
        form['field.target.package'] = ''
        self.widget.request = LaunchpadTestRequest(form=form)
        self.assertEqual(self.distribution, self.widget.getInputValue())

    def test_getInputValue_distribution_invalid(self):
        # An error is raised when the distribution is invalid.
        form = self.form
        form['field.target.package'] = ''
        form['field.target.distribution'] = 'non-existent'
        self.widget.request = LaunchpadTestRequest(form=form)
        message = (
            "There is no distribution named 'non-existent' registered in "
            "Launchpad")
        e = self.assertRaises(WidgetInputError, self.widget.getInputValue)
        self.assertEqual(LaunchpadValidationError(message), e.errors)
        self.assertEqual(html_escape(message), self.widget.error())

    def test_getInputValue_product(self):
        # The field value is the product when the project radio button
        # is selected and the project sub field is valid.
        form = self.form
        form['field.target'] = 'product'
        self.widget.request = LaunchpadTestRequest(form=form)
        self.assertEqual(self.project, self.widget.getInputValue())

    def test_getInputValue_product_missing(self):
        # An error is raised when the product field is missing.
        form = self.form
        form['field.target'] = 'product'
        del form['field.target.product']
        self.widget.request = LaunchpadTestRequest(form=form)
        message = 'Please enter a project name'
        e = self.assertRaises(WidgetInputError, self.widget.getInputValue)
        self.assertEqual(LaunchpadValidationError(message), e.errors)
        self.assertEqual(message, self.widget.error())

    def test_getInputValue_product_invalid(self):
        # An error is raised when the product is not valid.
        form = self.form
        form['field.target'] = 'product'
        form['field.target.product'] = 'non-existent'
        self.widget.request = LaunchpadTestRequest(form=form)
        message = (
            "There is no project named 'non-existent' registered in "
            "Launchpad")
        e = self.assertRaises(WidgetInputError, self.widget.getInputValue)
        self.assertEqual(LaunchpadValidationError(message), e.errors)
        self.assertEqual(html_escape(message), self.widget.error())

    def test_setRenderedValue_product(self):
        # Passing a product will set the widget's render state to 'product'.
        self.widget.setUpSubWidgets()
        self.widget.setRenderedValue(self.project)
        self.assertEqual('product', self.widget.default_option)
        self.assertEqual(
            self.project, self.widget.product_widget._getCurrentValue())

    def test_setRenderedValue_distribution(self):
        # Passing a distribution will set the widget's render state to
        # 'package', but only the distribution widget is set.
        self.widget.setUpSubWidgets()
        self.widget.setRenderedValue(self.distribution)
        self.assertEqual('package', self.widget.default_option)
        self.assertEqual(
            self.distribution,
            self.widget.distribution_widget._getCurrentValue())
        self.assertEqual(
            None, self.widget.package_widget._getCurrentValue())

    def test_setRenderedValue_package(self):
        # Passing a package will set the widget's render state to
        # 'package'.
        self.widget.setUpSubWidgets()
        self.widget.setRenderedValue(self.package)
        self.assertEqual('package', self.widget.default_option)
        self.assertEqual(
            self.distribution,
            self.widget.distribution_widget._getCurrentValue())
        self.assertEqual(
            self.package.sourcepackagename,
            self.widget.package_widget._getCurrentValue())

    def test_call(self):
        # The __call__ method setups the widgets and the options.
        markup = self.widget()
        self.assertIsNot(None, self.widget.package_widget)
        self.assertTrue('package' in self.widget.options)
        expected_ids = [
            'field.target.distribution',
            'field.target.option.package',
            'field.target.option.product',
            'field.target.package',
            'field.target.product',
            ]
        soup = BeautifulSoup(markup)
        fields = soup.findAll(['input', 'select'], {'id': re.compile('.*')})
        ids = [field['id'] for field in fields]
        self.assertContentEqual(expected_ids, ids)
class LaunchpadTargetWidgetTestCase(TestCaseWithFactory):
    """Test the LaunchpadTargetWidget class."""

    layer = DatabaseFunctionalLayer

    @property
    def form(self):
        return {
        'field.target': 'package',
        'field.target.distribution': 'fnord',
        'field.target.package': 'snarf',
        'field.target.product': 'pting',
        }

    def setUp(self):
        super(LaunchpadTargetWidgetTestCase, self).setUp()
        self.distribution, self.package = self.factory.makeDSPCache(
            distro_name='fnord', package_name='snarf')
        self.project = self.factory.makeProduct('pting')
        field = Reference(
            __name__='target', schema=Interface, title=u'target')
        field = field.bind(Thing())
        request = LaunchpadTestRequest()
        self.widget = LaunchpadTargetWidget(field, request)

    def test_implements(self):
        self.assertTrue(verifyObject(IBrowserWidget, self.widget))
        self.assertTrue(verifyObject(IInputWidget, self.widget))

    def test_template(self):
        # The render template is setup.
        self.assertTrue(
            self.widget.template.filename.endswith('launchpad-target.pt'),
            'Template was not setup.')

    def test_default_option(self):
        # This package field is the default option.
        self.assertEqual('package', self.widget.default_option)

    def test_getDistributionVocabulary(self):
        # The vocabulary is always "Distribution".
        self.assertEqual(
            'Distribution', self.widget.getDistributionVocabulary())

    def test_hasInput_false(self):
        # hasInput is false when the widget's name is not in the form data.
        self.widget.request = LaunchpadTestRequest(form={})
        self.assertEqual('field.target', self.widget.name)
        self.assertFalse(self.widget.hasInput())

    def test_hasInput_true(self):
        # hasInput is true is the widget's name in the form data.
        self.widget.request = LaunchpadTestRequest(form=self.form)
        self.assertEqual('field.target', self.widget.name)
        self.assertTrue(self.widget.hasInput())

    def test_setUpSubWidgets_first_call(self):
        # The subwidgets are setup and a flag is set.
        self.widget.setUpSubWidgets()
        self.assertTrue(self.widget._widgets_set_up)
        self.assertIsInstance(
            self.widget.distribution_widget.context.vocabulary,
            DistributionVocabulary)
        self.assertIsInstance(
            self.widget.package_widget.context.vocabulary,
            BinaryAndSourcePackageNameVocabulary)
        self.assertIsInstance(
            self.widget.product_widget.context.vocabulary,
            ProductVocabulary)

    def test_setUpSubWidgets_second_call(self):
        # The setUpSubWidgets method exits early if a flag is set to
        # indicate that the widgets were setup.
        self.widget._widgets_set_up = True
        self.widget.setUpSubWidgets()
        self.assertIs(None, getattr(self.widget, 'distribution_widget', None))
        self.assertIs(None, getattr(self.widget, 'package_widget', None))
        self.assertIs(None, getattr(self.widget, 'product_widget', None))

    def test_setUpOptions_default_package_checked(self):
        # The radio button options are composed of the setup widgets with
        # the package widget set as the default.
        self.widget.setUpSubWidgets()
        self.widget.setUpOptions()
        self.assertEqual(
            "selectWidget('field.target.option.package', event)",
            self.widget.package_widget.onKeyPress)
        self.assertEqual(
            "selectWidget('field.target.option.product', event)",
            self.widget.product_widget.onKeyPress)
        self.assertEqual(
            '<input class="radioType" checked="checked" '
            'id="field.target.option.package" name="field.target" '
            'type="radio" value="package" />',
            self.widget.options['package'])
        self.assertEqual(
            '<input class="radioType" '
            'id="field.target.option.product" name="field.target" '
            'type="radio" value="product" />',
            self.widget.options['product'])

    def test_setUpOptions_product_checked(self):
        # The product radio button is selected when the form is submitted
        # when the target field's value is 'product'.
        form = {
            'field.target': 'product',
            }
        self.widget.request = LaunchpadTestRequest(form=form)
        self.widget.setUpSubWidgets()
        self.widget.setUpOptions()
        self.assertEqual(
            '<input class="radioType" '
            'id="field.target.option.package" name="field.target" '
            'type="radio" value="package" />',
            self.widget.options['package'])
        self.assertEqual(
            '<input class="radioType" checked="checked" '
            'id="field.target.option.product" name="field.target" '
            'type="radio" value="product" />',
            self.widget.options['product'])

    def test_hasValidInput_true(self):
        # The field input is valid when all submitted parts are valid.
        self.widget.request = LaunchpadTestRequest(form=self.form)
        self.assertTrue(self.widget.hasValidInput())

    def test_hasValidInput_false(self):
        # The field input is invalid if any of the submitted parts are
        # invalid.
        form = self.form
        form['field.target.package'] = 'non-existent'
        self.widget.request = LaunchpadTestRequest(form=form)
        self.assertFalse(self.widget.hasValidInput())

    def test_getInputValue_package_spn(self):
        # The field value is the package when the package radio button
        # is selected and the package sub field has official spn.
        self.widget.request = LaunchpadTestRequest(form=self.form)
        self.assertEqual(self.package, self.widget.getInputValue())

    def test_getInputValue_package_invalid(self):
        # An error is raised when the package is not published in the distro.
        form = self.form
        form['field.target.package'] = 'non-existent'
        self.widget.request = LaunchpadTestRequest(form=form)
        message = (
            "There is no package named 'non-existent' published in Fnord.")
        e = self.assertRaises(WidgetInputError, self.widget.getInputValue)
        self.assertEqual(LaunchpadValidationError(message), e.errors)
        self.assertEqual(html_escape(message), self.widget.error())

    def test_getInputValue_distribution(self):
        # The field value is the distribution when the package radio button
        # is selected and the package sub field empty.
        form = self.form
        form['field.target.package'] = ''
        self.widget.request = LaunchpadTestRequest(form=form)
        self.assertEqual(self.distribution, self.widget.getInputValue())

    def test_getInputValue_distribution_invalid(self):
        # An error is raised when the distribution is invalid.
        form = self.form
        form['field.target.package'] = ''
        form['field.target.distribution'] = 'non-existent'
        self.widget.request = LaunchpadTestRequest(form=form)
        message = (
            "There is no distribution named 'non-existent' registered in "
            "Launchpad")
        e = self.assertRaises(WidgetInputError, self.widget.getInputValue)
        self.assertEqual(LaunchpadValidationError(message), e.errors)
        self.assertEqual(html_escape(message), self.widget.error())

    def test_getInputValue_product(self):
        # The field value is the product when the project radio button
        # is selected and the project sub field is valid.
        form = self.form
        form['field.target'] = 'product'
        self.widget.request = LaunchpadTestRequest(form=form)
        self.assertEqual(self.project, self.widget.getInputValue())

    def test_getInputValue_product_missing(self):
        # An error is raised when the product field is missing.
        form = self.form
        form['field.target'] = 'product'
        del form['field.target.product']
        self.widget.request = LaunchpadTestRequest(form=form)
        message = 'Please enter a project name'
        e = self.assertRaises(WidgetInputError, self.widget.getInputValue)
        self.assertEqual(LaunchpadValidationError(message), e.errors)
        self.assertEqual(message, self.widget.error())

    def test_getInputValue_product_invalid(self):
        # An error is raised when the product is not valid.
        form = self.form
        form['field.target'] = 'product'
        form['field.target.product'] = 'non-existent'
        self.widget.request = LaunchpadTestRequest(form=form)
        message = (
            "There is no project named 'non-existent' registered in "
            "Launchpad")
        e = self.assertRaises(WidgetInputError, self.widget.getInputValue)
        self.assertEqual(LaunchpadValidationError(message), e.errors)
        self.assertEqual(html_escape(message), self.widget.error())

    def test_setRenderedValue_product(self):
        # Passing a product will set the widget's render state to 'product'.
        self.widget.setUpSubWidgets()
        self.widget.setRenderedValue(self.project)
        self.assertEqual('product', self.widget.default_option)
        self.assertEqual(
            self.project, self.widget.product_widget._getCurrentValue())

    def test_setRenderedValue_distribution(self):
        # Passing a distribution will set the widget's render state to
        # 'package', but only the distribution widget is set.
        self.widget.setUpSubWidgets()
        self.widget.setRenderedValue(self.distribution)
        self.assertEqual('package', self.widget.default_option)
        self.assertEqual(
            self.distribution,
            self.widget.distribution_widget._getCurrentValue())
        self.assertEqual(
            None, self.widget.package_widget._getCurrentValue())

    def test_setRenderedValue_package(self):
        # Passing a package will set the widget's render state to
        # 'package'.
        self.widget.setUpSubWidgets()
        self.widget.setRenderedValue(self.package)
        self.assertEqual('package', self.widget.default_option)
        self.assertEqual(
            self.distribution,
            self.widget.distribution_widget._getCurrentValue())
        self.assertEqual(
            self.package.sourcepackagename,
            self.widget.package_widget._getCurrentValue())

    def test_call(self):
        # The __call__ method setups the widgets and the options.
        markup = self.widget()
        self.assertIsNot(None, self.widget.package_widget)
        self.assertTrue('package' in self.widget.options)
        expected_ids = [
            'field.target.distribution',
            'field.target.option.package',
            'field.target.option.product',
            'field.target.package',
            'field.target.product',
            ]
        soup = BeautifulSoup(markup)
        fields = soup.findAll(['input', 'select'], {'id': re.compile('.*')})
        ids = [field['id'] for field in fields]
        self.assertContentEqual(expected_ids, ids)