def test_unarchive_bucket(self, requests_mock):
        path = '/organizations/{}/buckets/{}/unarchive'.format(
            ORGANIZATION_ID, BUCKET_ID)
        requests_mock.post(path, json={})

        client = APIClient()
        client.unarchive_bucket(ORGANIZATION_ID, BUCKET_ID)
    def test_unarchive_channel(self, requests_mock):
        path = '/organizations/{}/channels/{}/unarchive'.format(
            ORGANIZATION_ID, CHANNEL_ID)
        requests_mock.post(path, json={})

        client = APIClient()
        client.unarchive_channel(ORGANIZATION_ID, CHANNEL_ID)
    def test_get_bucket_file(self, m):
        path = '{}/organizations/{}/buckets/{}/files/{}'.format(
            API_BASE_URL, ORGANIZATION_ID, BUCKET_ID, BUCKET_FILE_ID)
        m.get(path,
              json={
                  "size": 4,
                  "etag": "xxx",
                  "is_file": True,
                  "last_modified": "2019-09-17T07:43:51Z",
                  "uploaded_at": "2019-09-17T07:43:51Z",
                  "url_expires_on": "2019-09-17T07:43:51Z",
                  "download_uri": "...",
                  "metadata": {
                      "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                      **ENCODED_METADATA
                  },
                  "file_id": BUCKET_FILE_ID,
              })

        api_client = APIClient()
        res = api_client.get_bucket_file(ORGANIZATION_ID, BUCKET_ID,
                                         BUCKET_FILE_ID)

        req = m.request_history[0]
        assert req.method == 'GET'
        assert BUCKET_FILE_ID == res['file_id']
    def test_post_channel_file_upload(self, m):
        path = '/channels/{}/upload'.format(CHANNEL_ID)
        m.post(path,
               json={
                   "uploaded_at": "2019-09-17T07:43:51Z",
                   "metadata": {
                       "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                       **ENCODED_METADATA
                   },
                   "lifetime": LIFETIME,
                   "file_id": FILE_ID,
                   "content_type": CONTENT_TYPE
               })

        api_client = APIClient()
        res = api_client.post_channel_file_upload(
            CHANNEL_ID,
            BytesIO('test data'.encode('utf-8')),
            CONTENT_TYPE,
            metadata=METADATA,
            lifetime=LIFETIME,
            conflict_target=CONFLICT_TARGET)

        req = m.request_history[0]
        assert req.method == 'POST'
        assert ENCODED_METADATA.items() < req.headers.items()
        assert req.headers['Content-Type'] == CONTENT_TYPE
        assert parse_qs(req.query) == {
            'lifetime': [LIFETIME],
            'conflict_target': [CONFLICT_TARGET]
        }
        assert METADATA.items() < res['metadata'].items()
    def test_put_channel_file_metadata(self, m):
        path = '/channels/{}/{}/metadata'.format(CHANNEL_ID, FILE_ID)
        m.put(path,
              json={
                  "uploaded_at": "2019-09-17T07:43:51+00:00",
                  "metadata": {
                      "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                      **ENCODED_METADATA
                  },
                  "file_id": FILE_ID,
                  "content_type": CONTENT_TYPE
              })

        api_client = APIClient()
        res = api_client.put_channel_file_metadata(CHANNEL_ID, FILE_ID,
                                                   METADATA)

        req = m.request_history[0]
        assert req.method == 'PUT'
        assert ENCODED_METADATA == req.json()

        assert METADATA.items() < res['metadata'].items()
    def test_get_channel_file_download(self, m):
        path = '/channels/{}/{}'.format(CHANNEL_ID, FILE_ID)
        m.get(path,
              json={
                  "url_expires_on": "2019-09-17T09:49:14+00:00",
                  "uploaded_at": "2019-09-17T07:43:51+00:00",
                  "metadata": {
                      "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                      **ENCODED_METADATA
                  },
                  "file_id": FILE_ID,
                  "download_uri": "xxxxx",
                  "content_type": CONTENT_TYPE
              })

        api_client = APIClient()
        res = api_client.get_channel_file_download(CHANNEL_ID, FILE_ID)

        req = m.request_history[0]
        assert req.method == 'GET'

        assert METADATA.items() < res['metadata'].items()
    def test_get_channel_file_upload(self, m):
        path = '/channels/{}'.format(CHANNEL_ID)
        m.post(path,
               json={
                   "uploaded_at": "2019-09-17T07:43:51Z",
                   "metadata": {
                       "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                       **ENCODED_METADATA
                   },
                   "file_id": FILE_ID,
                   "content_type": CONTENT_TYPE
               })

        api_client = APIClient()
        res = api_client.get_channel_file_upload(CHANNEL_ID, CONTENT_TYPE,
                                                 METADATA)

        req = m.request_history[0]
        assert req.method == 'POST'
        assert ENCODED_METADATA.items() < req.headers.items()
        assert req.headers['Content-Type'] == CONTENT_TYPE

        assert METADATA.items() < res['metadata'].items()
    def test_upload_bucket_files(self, m):
        path = '{}/organizations/{}/buckets/{}/files'.format(
            API_BASE_URL, ORGANIZATION_ID, BUCKET_ID)
        m.post(path,
               json={
                   "uploaded_at": "2019-09-17T07:43:51Z",
                   "metadata": {
                       "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                       **ENCODED_METADATA
                   },
                   "lifetime": LIFETIME,
                   "file_id": FILE_ID,
                   "content_type": CONTENT_TYPE
               })

        api_client = APIClient()
        res = api_client.upload_bucket_files(ORGANIZATION_ID,
                                             BUCKET_ID,
                                             'tests/dummydata',
                                             lifetime=LIFETIME)
        assert res["status"]

        req = m.request_history[0]
        assert req.method == 'POST'
    def test_list_channel_files(self, m):
        path = '/channels/{}'.format(CHANNEL_ID)
        m.get(path,
              json={
                  'files': [{
                      "uploaded_at": "2019-09-17T07:43:51Z",
                      "metadata": {
                          "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                          **ENCODED_METADATA
                      },
                      "lifetime": LIFETIME,
                      "file_id": FILE_ID,
                      "content_type": CONTENT_TYPE
                  }]
              })

        api_client = APIClient()
        res = api_client.list_channel_files(CHANNEL_ID)

        req = m.request_history[0]
        assert req.method == 'GET'

        file = res['files'][0]
        assert METADATA.items() < file['metadata'].items()
    def test_upload_bucket_file(self, m):
        path = '{}/organizations/{}/buckets/{}/files'.format(
            API_BASE_URL, ORGANIZATION_ID, BUCKET_ID)
        m.post(path,
               json={
                   "uploaded_at": "2019-09-17T07:43:51Z",
                   "metadata": {
                       "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                       **ENCODED_METADATA
                   },
                   "lifetime": LIFETIME,
                   "file_id": FILE_ID,
                   "content_type": CONTENT_TYPE
               })

        api_client = APIClient()
        filepath = 'tests/dummydata/dummy1.txt'
        res = api_client.upload_bucket_file(ORGANIZATION_ID,
                                            BUCKET_ID,
                                            open(filepath),
                                            filepath,
                                            CONTENT_TYPE,
                                            metadata=METADATA,
                                            lifetime=LIFETIME)

        req = m.request_history[0]
        assert req.method == 'POST'
        assert ENCODED_METADATA.items() < req.headers.items()
        # assert req.headers['Content-Type'] == CONTENT_TYPE
        # assert req.query == 'lifetime={}'.format(LIFETIME)

        assert METADATA.items() < res['metadata'].items()

        with pytest.raises(BadRequest):
            api_client.upload_bucket_file(ORGANIZATION_ID,
                                          BUCKET_ID,
                                          open(filepath),
                                          '/dummy',
                                          CONTENT_TYPE,
                                          metadata=METADATA,
                                          lifetime=LIFETIME)

        with pytest.raises(BadRequest):
            api_client.upload_bucket_file(ORGANIZATION_ID,
                                          BUCKET_ID,
                                          open(filepath),
                                          'dummy/../hoge.data',
                                          CONTENT_TYPE,
                                          metadata=METADATA,
                                          lifetime=LIFETIME)
 def setUp(self):
     Connection.BASE_URL = API_BASE_URL
     self.api_client = APIClient()
class TestApiClient(TestCase):
    def setUp(self):
        Connection.BASE_URL = API_BASE_URL
        self.api_client = APIClient()

    @patch('requests.Session.request')
    def test_create_channel(self, m):
        self.api_client.create_channel(ORGANIZATION_ID, CHANNEL_NAME,
                                       CHANNEL_DESCRIPTION, STORAGE_TYPE)
        url = '{}/organizations/{}/channels'.format(API_BASE_URL,
                                                    ORGANIZATION_ID)
        params = {
            'name': CHANNEL_NAME,
            'description': CHANNEL_DESCRIPTION,
            'storage_type': STORAGE_TYPE
        }
        m.assert_called_once_with(
            'POST',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=params)

    @patch('requests.Session.request')
    def test_list_channels(self, m):
        self.api_client.list_channels(ORGANIZATION_ID)
        url = '{}/organizations/{}/channels'.format(API_BASE_URL,
                                                    ORGANIZATION_ID)
        m.assert_called_once_with(
            'GET',
            url,
            params={},
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @patch('requests.Session.request')
    def test_list_channels_filter_archived_true(self, m):
        self.api_client.list_channels(ORGANIZATION_ID, filter_archived=True)
        url = '{}/organizations/{}/channels'.format(API_BASE_URL,
                                                    ORGANIZATION_ID)
        expected_params = {'filter_archived': 'exclude_archived'}
        m.assert_called_once_with(
            'GET',
            url,
            params=expected_params,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @patch('requests.Session.request')
    def test_list_channels_filter_archived_false(self, m):
        self.api_client.list_channels(ORGANIZATION_ID, filter_archived=False)
        url = '{}/organizations/{}/channels'.format(API_BASE_URL,
                                                    ORGANIZATION_ID)
        expected_params = {'filter_archived': 'include_archived'}
        m.assert_called_once_with(
            'GET',
            url,
            params=expected_params,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @patch('requests.Session.request')
    def test_get_channel(self, m):
        self.api_client.get_channel(ORGANIZATION_ID, CHANNEL_ID)
        url = '{}/organizations/{}/channels/{}'.format(API_BASE_URL,
                                                       ORGANIZATION_ID,
                                                       CHANNEL_ID)
        m.assert_called_once_with(
            'GET',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @patch('requests.Session.request')
    def test_patch_channel(self, m):
        self.api_client.patch_channel(ORGANIZATION_ID, CHANNEL_ID,
                                      CHANNEL_NAME, CHANNEL_DESCRIPTION)
        url = '{}/organizations/{}/channels/{}'.format(API_BASE_URL,
                                                       ORGANIZATION_ID,
                                                       CHANNEL_ID)
        params = {'name': CHANNEL_NAME, 'description': CHANNEL_DESCRIPTION}
        m.assert_called_once_with(
            'PATCH',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=params)

    @patch('requests.Session.request')
    def test_put_channel_datasource(self, m):
        self.api_client.put_channel_datasource(ORGANIZATION_ID, CHANNEL_ID,
                                               DATASOURCE_ID)
        url = '{}/organizations/{}/channels/{}/datasources/{}'.format(
            API_BASE_URL, ORGANIZATION_ID, CHANNEL_ID, DATASOURCE_ID)
        m.assert_called_once_with(
            'PUT',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @patch('requests.Session.request')
    def test_list_channel_datasources(self, m):
        self.api_client.list_channel_datasources(ORGANIZATION_ID, CHANNEL_ID)
        url = '{}/organizations/{}/channels/{}/datasources'.format(
            API_BASE_URL, ORGANIZATION_ID, CHANNEL_ID)
        m.assert_called_once_with(
            'GET',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @patch('requests.Session.request')
    def test_delete_channel_datasource(self, m):
        self.api_client.delete_channel_datasource(ORGANIZATION_ID, CHANNEL_ID,
                                                  DATASOURCE_ID)
        url = '{}/organizations/{}/channels/{}/datasources/{}'.format(
            API_BASE_URL, ORGANIZATION_ID, CHANNEL_ID, DATASOURCE_ID)
        m.assert_called_once_with(
            'DELETE',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @requests_mock.Mocker()
    def test_get_channel_file_upload(self, m):
        path = '/channels/{}'.format(CHANNEL_ID)
        m.post(path,
               json={
                   "uploaded_at": "2019-09-17T07:43:51Z",
                   "metadata": {
                       "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                       **ENCODED_METADATA
                   },
                   "file_id": FILE_ID,
                   "content_type": CONTENT_TYPE
               })

        api_client = APIClient()
        res = api_client.get_channel_file_upload(CHANNEL_ID, CONTENT_TYPE,
                                                 METADATA)

        req = m.request_history[0]
        assert req.method == 'POST'
        assert ENCODED_METADATA.items() < req.headers.items()
        assert req.headers['Content-Type'] == CONTENT_TYPE

        assert METADATA.items() < res['metadata'].items()

    @patch('requests.Session.request')
    def test_get_channel_file_upload_with_japanese_metadata(self, m):
        metadata = {'x-abeja-meta-filename': '日本語', 'x-abeja-meta-テスト': 'テスト1'}
        self.api_client.get_channel_file_upload(CHANNEL_ID, CONTENT_TYPE,
                                                metadata)
        url = '{}/channels/{}'.format(API_BASE_URL, CHANNEL_ID)
        expected_headers = {
            'Content-Type':
            CONTENT_TYPE,
            'User-Agent':
            'abeja-platform-sdk/{}'.format(VERSION),
            'x-abeja-meta-filename':
            '%E6%97%A5%E6%9C%AC%E8%AA%9E',
            'x-abeja-meta-%E3%83%86%E3%82%B9%E3%83%88':
            '%E3%83%86%E3%82%B9%E3%83%88%EF%BC%91'
        }
        m.assert_called_once_with('POST',
                                  url,
                                  params=None,
                                  headers=expected_headers,
                                  timeout=30,
                                  data=None,
                                  json=None)

    @requests_mock.Mocker()
    def test_post_channel_file_upload(self, m):
        path = '/channels/{}/upload'.format(CHANNEL_ID)
        m.post(path,
               json={
                   "uploaded_at": "2019-09-17T07:43:51Z",
                   "metadata": {
                       "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                       **ENCODED_METADATA
                   },
                   "lifetime": LIFETIME,
                   "file_id": FILE_ID,
                   "content_type": CONTENT_TYPE
               })

        api_client = APIClient()
        res = api_client.post_channel_file_upload(
            CHANNEL_ID,
            BytesIO('test data'.encode('utf-8')),
            CONTENT_TYPE,
            metadata=METADATA,
            lifetime=LIFETIME,
            conflict_target=CONFLICT_TARGET)

        req = m.request_history[0]
        assert req.method == 'POST'
        assert ENCODED_METADATA.items() < req.headers.items()
        assert req.headers['Content-Type'] == CONTENT_TYPE
        assert parse_qs(req.query) == {
            'lifetime': [LIFETIME],
            'conflict_target': [CONFLICT_TARGET]
        }
        assert METADATA.items() < res['metadata'].items()

    @requests_mock.Mocker()
    def test_list_channel_files(self, m):
        path = '/channels/{}'.format(CHANNEL_ID)
        m.get(path,
              json={
                  'files': [{
                      "uploaded_at": "2019-09-17T07:43:51Z",
                      "metadata": {
                          "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                          **ENCODED_METADATA
                      },
                      "lifetime": LIFETIME,
                      "file_id": FILE_ID,
                      "content_type": CONTENT_TYPE
                  }]
              })

        api_client = APIClient()
        res = api_client.list_channel_files(CHANNEL_ID)

        req = m.request_history[0]
        assert req.method == 'GET'

        file = res['files'][0]
        assert METADATA.items() < file['metadata'].items()

    @patch('requests.Session.request')
    def test_list_channel_files_with_sort(self, m):
        self.api_client.list_channel_files(CHANNEL_ID, sort='-uploaded_at')
        url = '{}/channels/{}'.format(API_BASE_URL, CHANNEL_ID)
        m.assert_called_once_with(
            'GET',
            url,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None,
            params={'sort': '-uploaded_at'})

    @requests_mock.Mocker()
    def test_get_channel_file_download(self, m):
        path = '/channels/{}/{}'.format(CHANNEL_ID, FILE_ID)
        m.get(path,
              json={
                  "url_expires_on": "2019-09-17T09:49:14+00:00",
                  "uploaded_at": "2019-09-17T07:43:51+00:00",
                  "metadata": {
                      "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                      **ENCODED_METADATA
                  },
                  "file_id": FILE_ID,
                  "download_uri": "xxxxx",
                  "content_type": CONTENT_TYPE
              })

        api_client = APIClient()
        res = api_client.get_channel_file_download(CHANNEL_ID, FILE_ID)

        req = m.request_history[0]
        assert req.method == 'GET'

        assert METADATA.items() < res['metadata'].items()

    @patch('requests.Session.request')
    def test_delete_channel_file(self, m):
        self.api_client.delete_channel_file(CHANNEL_ID, FILE_ID)
        url = '{}/channels/{}/{}'.format(API_BASE_URL, CHANNEL_ID, FILE_ID)
        m.assert_called_once_with(
            'DELETE',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @requests_mock.Mocker()
    def test_put_channel_file_metadata(self, m):
        path = '/channels/{}/{}/metadata'.format(CHANNEL_ID, FILE_ID)
        m.put(path,
              json={
                  "uploaded_at": "2019-09-17T07:43:51+00:00",
                  "metadata": {
                      "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                      **ENCODED_METADATA
                  },
                  "file_id": FILE_ID,
                  "content_type": CONTENT_TYPE
              })

        api_client = APIClient()
        res = api_client.put_channel_file_metadata(CHANNEL_ID, FILE_ID,
                                                   METADATA)

        req = m.request_history[0]
        assert req.method == 'PUT'
        assert ENCODED_METADATA == req.json()

        assert METADATA.items() < res['metadata'].items()

    @patch('requests.Session.request')
    def test_put_channel_file_lifetime(self, m):
        self.api_client.put_channel_file_lifetime(CHANNEL_ID, FILE_ID,
                                                  LIFETIME)
        url = '{}/channels/{}/{}/lifetime'.format(API_BASE_URL, CHANNEL_ID,
                                                  FILE_ID)
        expected_json = {'lifetime': LIFETIME}
        m.assert_called_once_with(
            'PUT',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=expected_json)

    @patch('requests.Session.request')
    def test_create_bucket(self, m):
        self.api_client.create_bucket(ORGANIZATION_ID, BUCKET_NAME,
                                      BUCKET_DESCRIPTION)
        url = '{}/organizations/{}/buckets'.format(API_BASE_URL,
                                                   ORGANIZATION_ID)
        params = {'name': BUCKET_NAME, 'description': BUCKET_DESCRIPTION}
        m.assert_called_once_with(
            'POST',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=params)

    @patch('requests.Session.request')
    def test_list_buckets(self, m):
        self.api_client.list_buckets(ORGANIZATION_ID)
        url = '{}/organizations/{}/buckets'.format(API_BASE_URL,
                                                   ORGANIZATION_ID)
        m.assert_called_once_with(
            'GET',
            url,
            params={},
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @patch('requests.Session.request')
    def test_get_bucket(self, m):
        self.api_client.get_bucket(ORGANIZATION_ID, BUCKET_ID)
        url = '{}/organizations/{}/buckets/{}'.format(API_BASE_URL,
                                                      ORGANIZATION_ID,
                                                      BUCKET_ID)
        m.assert_called_once_with(
            'GET',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=None)

    @patch('requests.Session.request')
    def test_patch_bucket(self, m):
        self.api_client.patch_bucket(ORGANIZATION_ID, BUCKET_ID, BUCKET_NAME,
                                     BUCKET_DESCRIPTION)
        url = '{}/organizations/{}/buckets/{}'.format(API_BASE_URL,
                                                      ORGANIZATION_ID,
                                                      BUCKET_ID)
        params = {'name': BUCKET_NAME, 'description': BUCKET_DESCRIPTION}
        m.assert_called_once_with(
            'PATCH',
            url,
            params=None,
            headers={'User-Agent': 'abeja-platform-sdk/{}'.format(VERSION)},
            timeout=30,
            data=None,
            json=params)

    @requests_mock.Mocker()
    def test_upload_bucket_file(self, m):
        path = '{}/organizations/{}/buckets/{}/files'.format(
            API_BASE_URL, ORGANIZATION_ID, BUCKET_ID)
        m.post(path,
               json={
                   "uploaded_at": "2019-09-17T07:43:51Z",
                   "metadata": {
                       "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                       **ENCODED_METADATA
                   },
                   "lifetime": LIFETIME,
                   "file_id": FILE_ID,
                   "content_type": CONTENT_TYPE
               })

        api_client = APIClient()
        filepath = 'tests/dummydata/dummy1.txt'
        res = api_client.upload_bucket_file(ORGANIZATION_ID,
                                            BUCKET_ID,
                                            open(filepath),
                                            filepath,
                                            CONTENT_TYPE,
                                            metadata=METADATA,
                                            lifetime=LIFETIME)

        req = m.request_history[0]
        assert req.method == 'POST'
        assert ENCODED_METADATA.items() < req.headers.items()
        # assert req.headers['Content-Type'] == CONTENT_TYPE
        # assert req.query == 'lifetime={}'.format(LIFETIME)

        assert METADATA.items() < res['metadata'].items()

        with pytest.raises(BadRequest):
            api_client.upload_bucket_file(ORGANIZATION_ID,
                                          BUCKET_ID,
                                          open(filepath),
                                          '/dummy',
                                          CONTENT_TYPE,
                                          metadata=METADATA,
                                          lifetime=LIFETIME)

        with pytest.raises(BadRequest):
            api_client.upload_bucket_file(ORGANIZATION_ID,
                                          BUCKET_ID,
                                          open(filepath),
                                          'dummy/../hoge.data',
                                          CONTENT_TYPE,
                                          metadata=METADATA,
                                          lifetime=LIFETIME)

    @requests_mock.Mocker()
    def test_upload_bucket_files(self, m):
        path = '{}/organizations/{}/buckets/{}/files'.format(
            API_BASE_URL, ORGANIZATION_ID, BUCKET_ID)
        m.post(path,
               json={
                   "uploaded_at": "2019-09-17T07:43:51Z",
                   "metadata": {
                       "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                       **ENCODED_METADATA
                   },
                   "lifetime": LIFETIME,
                   "file_id": FILE_ID,
                   "content_type": CONTENT_TYPE
               })

        api_client = APIClient()
        res = api_client.upload_bucket_files(ORGANIZATION_ID,
                                             BUCKET_ID,
                                             'tests/dummydata',
                                             lifetime=LIFETIME)
        assert res["status"]

        req = m.request_history[0]
        assert req.method == 'POST'
        # assert req.query == 'lifetime={}'.format(LIFETIME)

    @requests_mock.Mocker()
    def test_list_bucket_files(self, m):
        path = '{}/organizations/{}/buckets/{}/files'.format(
            API_BASE_URL, ORGANIZATION_ID, BUCKET_ID)
        m.get(path,
              json={
                  'files': [{
                      "size": 4,
                      "etag": "xxx",
                      "is_file": True,
                      "last_modified": "2019-09-17T07:43:51Z",
                      "uploaded_at": "2019-09-17T07:43:51Z",
                      "url_expires_on": "2019-09-17T07:43:51Z",
                      "download_uri": "...",
                      "metadata": {
                          "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                          **ENCODED_METADATA
                      },
                      "file_id": FILE_ID,
                  }]
              })

        api_client = APIClient()
        res = api_client.list_bucket_files(ORGANIZATION_ID, BUCKET_ID)

        req = m.request_history[0]
        assert req.method == 'GET'

        file = res['files'][0]
        assert METADATA.items() < file['metadata'].items()

    @requests_mock.Mocker()
    def test_get_bucket_file(self, m):
        path = '{}/organizations/{}/buckets/{}/files/{}'.format(
            API_BASE_URL, ORGANIZATION_ID, BUCKET_ID, BUCKET_FILE_ID)
        m.get(path,
              json={
                  "size": 4,
                  "etag": "xxx",
                  "is_file": True,
                  "last_modified": "2019-09-17T07:43:51Z",
                  "uploaded_at": "2019-09-17T07:43:51Z",
                  "url_expires_on": "2019-09-17T07:43:51Z",
                  "download_uri": "...",
                  "metadata": {
                      "x-abeja-sys-meta-organizationid": ORGANIZATION_ID,
                      **ENCODED_METADATA
                  },
                  "file_id": BUCKET_FILE_ID,
              })

        api_client = APIClient()
        res = api_client.get_bucket_file(ORGANIZATION_ID, BUCKET_ID,
                                         BUCKET_FILE_ID)

        req = m.request_history[0]
        assert req.method == 'GET'
        assert BUCKET_FILE_ID == res['file_id']