async def test_flag_as_popular_from_api(self, loop):
        meta_1 = Meta(key="some-meta-1")
        meta_2 = Meta(key="some-meta-2")
        meta_3 = Meta(key="some-meta-3")

        my_response = ClientResponse('GET', URL('http://api.wordpress.org/plugins/info/1.1/?action=query_plugins'
                                                '&request[browse]=popular&request[per_page]=200'))
        my_response.status = 200
        my_response.headers = {'Content-Type': 'application/json'}
        my_response._body = read_file(__file__, 'popular-plugins.json').encode('utf8')

        aiohttp_session = ClientSessionMock(get_response=my_response)
        handler = WordPressRepository(loop=loop, aiohttp_session=aiohttp_session, storage=MagicMock())
        handler.storage.read_meta.side_effect = [meta_1, meta_2, meta_3]

        await handler.mark_popular_plugins()

        handler.session.get.assert_called_with('http://api.wordpress.org/plugins/info/1.1/?action=query_plugins'
                                               '&request[browse]=popular&request[per_page]=200')
        handler.storage.write_meta.assert_has_calls([
            call(meta_1),
            call(meta_2),
        ])
        handler.storage.read_meta.assert_has_calls([
            call("plugins/woocommerce"),
            call("plugins/google-sitemap-generator"),
        ], any_order=True)
        self.assertTrue(meta_1.is_popular)
        self.assertTrue(meta_2.is_popular)
        self.assertIsNone(meta_3.is_popular)
    async def test_fetch_plugin_data(self, loop):
        my_response = ClientResponse('GET', URL('https://api.wordpress.org/plugins/info/1.0/better-wp-security.json'))
        my_response.status = 200
        my_response.headers = {'Content-Type': 'application/json'}
        my_response._body = read_file(__file__, 'better-wp-security.json').encode('utf8')

        aiohttp_session = ClientSessionMock(get_response=my_response)
        handler = WordPressRepository(loop=loop, aiohttp_session=aiohttp_session)

        plugin = await handler.fetch_plugin('better-wp-security')

        handler.session.get.assert_called_with('https://api.wordpress.org/plugins/info/1.0/better-wp-security.json')
        self.assertEqual('plugins/better-wp-security', plugin.key)
    def test_with_sample_output(self):
        content = read_file(__file__, 'twentyeleven.json')
        info = self.parser.parse(content)

        self.assertEqual(
            info,
            Meta(key="themes/twentyeleven",
                 name="Twenty Eleven",
                 url="https://wordpress.org/themes/twentyeleven/",
                 repositories=[
                     Repository(
                         type="subversion",
                         location=
                         "https://themes.svn.wordpress.org/twentyeleven/"),
                 ]))
    def test_with_sample_output(self):
        content = read_file(__file__, 'better-wp-security.json')
        info = self.parser.parse(content)

        self.assertEqual(
            info,
            Meta(
                key="plugins/better-wp-security",
                name="iThemes Security (formerly Better WP Security)",
                url="https://ithemes.com/security",
                repositories=[
                    Repository(
                        type="subversion",
                        location=
                        "https://plugins.svn.wordpress.org/better-wp-security/"
                    ),
                ]))
    async def test_fetch_theme_data(self, loop):
        my_response = ClientResponse(
            'GET',
            URL('https://api.wordpress.org/themes/info/1.1/?action=theme_information&request[slug]=twentyeleven'
                ))  # noqa
        my_response.status = 200
        my_response._headers = {'Content-Type': 'application/json'}
        my_response._body = read_file(__file__,
                                      'twentyeleven.json').encode('utf8')

        aiohttp_session = ClientSessionMock(get_response=my_response)
        handler = WordPressRepository(loop=loop,
                                      aiohttp_session=aiohttp_session)

        theme = await handler.fetch_theme('twentyeleven')

        handler.session.get.assert_called_with(
            'https://api.wordpress.org/themes/info/1.1/?action=theme_information&request[slug]=twentyeleven'
        )  # noqa
        self.assertEqual('themes/twentyeleven', theme.key)
        self.assertEqual('Twenty Eleven', theme.name)
    def test_invalid_json(self):
        content = read_file(__file__, 'twentyeleven.json')

        with self.assertRaises(ThemeNotFound):
            self.parser.parse(content[0:-20])
    def test_invalid_json(self):
        content = read_file(__file__, 'better-wp-security.json')

        with self.assertRaises(PluginNotFound):
            self.parser.parse(content[0:-20])