class InnerContentProxyTestCase(BaseTestCase):
    """
    Test all our inner content proxies
    """
    def afterSetUp(self):
        self.setRoles(['Manager'])
        self.article = self.addPloneArticle(self.portal, 'article')
        name = 'proxies'
        self.proxies = InnerContentContainer(name)
        self.proxies = self.proxies.__of__(self.portal)
        self.portal._setObject(name, self.proxies)
        for name, portal_type in test_proxies:
            self.proxies.invokeFactory(type_name=portal_type, id=name)

    def testGetPrimaryValue(self):
        self.loginAsPortalOwner()

        #for name, attached_name, attached_value, ref_type, ref_value, default in test_primary_fields:
        for data in test_primary_fields:

            proxy = self.proxies[data.proxy_name]
            primary_field = proxy.getField(data.primary_field_name)
            primary_accessor = primary_field.getAccessor(proxy)

            # Create referenced content
            kwargs = {}
            kwargs[data.primary_field_name] = data.ref_value
            ref_content = self.addContent(data.ref_type, self.portal,
                                          data.proxy_name)
            ref_content.edit(**kwargs)

            # No referenced content, no attached file
            value = primary_accessor()
            self.assertEquals(getattr(value, 'data', value), data.default)

            # Referenced content, no attached file
            kwargs = {}
            kwargs['referencedContent'] = (ref_content.UID(), )
            proxy.edit(**kwargs)
            value = primary_accessor()
            self.assertEquals(getattr(value, 'data', value), data.ref_expected)

            # referenced content, attached file
            kwargs = {}
            kwargs[data.attached_name] = data.attached_value
            proxy.edit(**kwargs)
            value = primary_accessor()
            self.assertEquals(getattr(value, 'data', value),
                              data.attached_expected)

            # No Referenced content, attached file
            kwargs = {}
            kwargs['referencedContent'] = ()
            value = primary_accessor()
            self.assertEquals(getattr(value, 'data', value),
                              data.attached_expected)

        self.logout()

    def testReferenceableInterfaces(self):

        for class_name in test_types_names:
            klass = getattr(pa_proxies, class_name)
            rf_present = hasattr(klass, 'referenceable_interfaces')
            if class_name == 'BaseInnerContentProxy':
                self.failIf(
                    rf_present,
                    "BaseInnerContentProxy must not define 'referenceable_interfaces'"
                )
            else:
                self.failIf(
                    not rf_present,
                    "%s must define 'referenceable_interfaces'" % class_name)
                attr = getattr(klass, 'referenceable_interfaces')
                is_tuple = type(attr) == TupleType
                self.failUnless(
                    is_tuple,
                    "%s.referenceable_interfaces is not a tuple" % class_name)

                if is_tuple:
                    for i in attr:
                        self.failUnless(
                            issubclass(i, Interface),
                            "%s.referenceable_interfaces: %s is not an interface"
                            % (class_name, i.__name__))

    def testgetReferenceablePortalTypes(self):
        article = self.article
        article.setFiles(file_proxy_values)
        fp = article.getFiles()[0]
        rpt = fp.getReferenceablePortalTypes(article.getField('files'))
        self.assertEquals(rpt, ['File'])

    def testRenameAfterCreation(self):
        fields_data = (
            (
                'LinkInnerContentProxy',
                {
                    'title': 'My nice title',
                },
                'my-nice-title',
            ),
            ('ImageInnerContentProxy', {
                'title': 'Test renamed after file name',
                'attachedImage_file': openTestFile('test.jpg'),
            }, 'test.jpg'),
            ('ImageInnerContentProxy', {
                'title': 'Test twice the same file name',
                'attachedImage_file': openTestFile('test.jpg'),
            }, 'test-1.jpg'),
            ('FileInnerContentProxy', {
                'title': 'Test file renamed after file name',
                'attachedFile_file': openTestFile('test.jpg'),
            }, 'test-2.jpg'),
        )

        self.loginAsPortalOwner()

        # from http://www.zope.org/Members/shh/ZopeTestCaseWiki/FrequentlyAskedQuestions
        # ensure we have _p_jar to avoid problems with CopySupport (cb_isMoveable)
        import transaction
        transaction.savepoint(optimistic=True)

        for ptype, data, expected_id in fields_data:
            initial_id = self.portal.generateUniqueId(ptype)
            proxy_id = self.proxies.invokeFactory(ptype, initial_id)
            proxy = self.proxies[proxy_id]
            proxy.processForm(values=data)

            self.assertEquals(proxy.getId(), expected_id)

    def test_searcheableText(self):
        """ test circular reference in linkinnerproxy """
        self.loginAsPortalOwner()

        ## article1 reference article2
        article1 = self.article
        article2 = self.addPloneArticle(self.portal, 'article2')
        _createObjectByType('InnerContentContainer', article1, 'links')
        _createObjectByType('LinkInnerContentProxy', article1.links, 'link')
        article1.links.link.update(title='Reference to article 2',
                                   description='description2',
                                   referencedContent=article2)
        ## article2 reference artilce1
        _createObjectByType('InnerContentContainer', article2, 'links')
        _createObjectByType('LinkInnerContentProxy', article2.links, 'link')
        article2.links.link.update(title='Reference to article 1',
                                   description='description1',
                                   referencedContent=article1)
        self.failUnless('Reference to article 2' in article1.SearchableText())
        self.failUnless('Reference to article 1' in article2.SearchableText())
class InnerContentProxyTestCase(BaseTestCase):
    """
    Test all our inner content proxies
    """

    def afterSetUp(self):
        self.setRoles(['Manager'])
        self.article = self.addPloneArticle(self.portal, 'article')
        name = 'proxies'
        self.proxies = InnerContentContainer(name)
        self.proxies = self.proxies.__of__(self.portal)
        self.portal._setObject(name, self.proxies)
        for name, portal_type in test_proxies:
            self.proxies.invokeFactory(type_name=portal_type, id=name)

    def testGetPrimaryValue(self):
        self.loginAsPortalOwner()

        #for name, attached_name, attached_value, ref_type, ref_value, default in test_primary_fields:
        for data in test_primary_fields:

            proxy = self.proxies[data.proxy_name]
            primary_field = proxy.getField(data.primary_field_name)
            primary_accessor = primary_field.getAccessor(proxy)

            # Create referenced content
            kwargs = {}
            kwargs[data.primary_field_name] = data.ref_value
            ref_content = self.addContent(data.ref_type, self.portal,
                                          data.proxy_name)
            ref_content.edit(**kwargs)

            # No referenced content, no attached file
            value = primary_accessor()
            self.assertEquals(getattr(value, 'data', value), data.default)

            # Referenced content, no attached file
            kwargs = {}
            kwargs['referencedContent'] = (ref_content.UID(),)
            proxy.edit(**kwargs)
            value = primary_accessor()
            self.assertEquals(getattr(value, 'data', value), data.ref_expected)

            # referenced content, attached file
            kwargs = {}
            kwargs[data.attached_name] = data.attached_value
            proxy.edit(**kwargs)
            value = primary_accessor()
            self.assertEquals(getattr(value, 'data', value),
                              data.attached_expected)

            # No Referenced content, attached file
            kwargs = {}
            kwargs['referencedContent'] = ()
            value = primary_accessor()
            self.assertEquals(getattr(value, 'data', value), data.attached_expected)

        self.logout()

    def testReferenceableInterfaces(self):

        for class_name in test_types_names:
            klass = getattr(pa_proxies, class_name)
            rf_present = hasattr(klass, 'referenceable_interfaces')
            if class_name == 'BaseInnerContentProxy':
                self.failIf(rf_present,
                            "BaseInnerContentProxy must not define 'referenceable_interfaces'")
            else:
                self.failIf(not rf_present, "%s must define 'referenceable_interfaces'" % class_name)
                attr = getattr(klass, 'referenceable_interfaces')
                is_tuple = type(attr) == TupleType
                self.failUnless(is_tuple, "%s.referenceable_interfaces is not a tuple" % class_name)

                if is_tuple:
                    for i in attr:
                        self.failUnless(issubclass(i, Interface),
                            "%s.referenceable_interfaces: %s is not an interface" % (class_name, i.__name__))

    def testgetReferenceablePortalTypes(self):
        article = self.article
        article.setFiles(file_proxy_values)
        fp = article.getFiles()[0]
        rpt = fp.getReferenceablePortalTypes(article.getField('files'))
        self.assertEquals(rpt, ['File'])

    def testRenameAfterCreation(self):
        fields_data = (
            ('LinkInnerContentProxy',
             {'title': 'My nice title',}, 'my-nice-title',
             ),
            ('ImageInnerContentProxy',
             {'title': 'Test renamed after file name',
              'attachedImage_file': openTestFile('test.jpg'),
              },
             'test.jpg'),
            ('ImageInnerContentProxy',
             {'title': 'Test twice the same file name',
              'attachedImage_file': openTestFile('test.jpg'),
              },
             'test-1.jpg'),
            ('FileInnerContentProxy',
             {'title': 'Test file renamed after file name',
              'attachedFile_file': openTestFile('test.jpg'),
              },
             'test-2.jpg'),
            )

        self.loginAsPortalOwner()

        # from http://www.zope.org/Members/shh/ZopeTestCaseWiki/FrequentlyAskedQuestions
        # ensure we have _p_jar to avoid problems with CopySupport (cb_isMoveable)
        import transaction
        transaction.savepoint(optimistic=True)

        for ptype, data, expected_id in fields_data:
            initial_id = self.portal.generateUniqueId(ptype)
            proxy_id = self.proxies.invokeFactory(ptype, initial_id)
            proxy = self.proxies[proxy_id]
            proxy.processForm(values=data)

            self.assertEquals(proxy.getId(), expected_id)

    def test_searcheableText(self):
        """ test circular reference in linkinnerproxy """
        self.loginAsPortalOwner()

        ## article1 reference article2
        article1 = self.article
        article2 = self.addPloneArticle(self.portal, 'article2')
        _createObjectByType('InnerContentContainer',article1,'links')
        _createObjectByType('LinkInnerContentProxy',article1.links, 'link')
        article1.links.link.update(title='Reference to article 2',
                                            description='description2',
                                            referencedContent=article2)
        ## article2 reference artilce1
        _createObjectByType('InnerContentContainer',article2,'links')
        _createObjectByType('LinkInnerContentProxy',article2.links, 'link')
        article2.links.link.update(title='Reference to article 1',
                                    description='description1',
                                    referencedContent=article1)
        self.failUnless('Reference to article 2' in article1.SearchableText() )
        self.failUnless('Reference to article 1' in article2.SearchableText() )