def test_download(self): url = self.get_api_path('/books/%s/download' % str(ObjectId())) response = self.client.get(url, headers=self.jwt_headers) self.assert404(response) self.assertResponseCode(response, 104040) data = self.get_data('book') playbook = self.get_data('playbook') data['name'] = str(uuid.uuid4()) result = Book.insert_one(data.copy()) book_id = result.inserted_id playbook['book_id'] = str(book_id) Playbook.insert_one(playbook) playbook_file = self.get_data('playbook_file') playbook_file['book_id'] = playbook['book_id'] Playbook.insert_one(playbook_file) self.trash += [[Book, book_id], [Playbook, playbook['_id']], [Playbook, playbook_file['_id']]] url = self.get_api_path('/books/%s/download' % str(book_id)) response = self.client.get(url, headers=self.jwt_headers) # Playbook().collection.delete_one({'_id': playbook['_id']}) # Book().collection.delete_one({'_id': book_id}) self.assert200(response) headers = response.headers self.assertEqual(headers['Content-Type'], 'application/zip') assert len(response.get_data()) > 0 response.close()
def test_rename(self): data = self.get_data('book') playbook = self.get_data('playbook') data['name'] = str(uuid.uuid4()) result = Book.insert_one(data.copy()) book_id = result.inserted_id playbook['book_id'] = str(book_id) Playbook.insert_one(playbook) self.trash += [ [Book, book_id], [Playbook, playbook['_id']], ] path = '/playbook/%s/rename' url = self.get_api_path(path % str(ObjectId())) response = self.client.patch(url, data=self.body({'path': ''}), headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 104001) file_path = os.path.join('newpath', playbook.get('path')) response = self.client.patch(url, data=self.body({'path': file_path}), headers=self.jwt_headers) self.assert404(response) self.assertResponseCode(response, 104040) url = self.get_api_path(path % str(playbook['_id'])) response = self.client.patch(url, data=self.body({'path': file_path}), headers=self.jwt_headers) self.assert200(response)
def test_update_book(self): data = self.get_data('book') data['name'] = str(uuid.uuid4()) result = Book.insert_one(data.copy()) book_id = result.inserted_id self.trash += [ [Book, book_id], ] url = self.get_api_path('/books/' + str(book_id)) response = self.client.put(url, data=self.body({}), headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 154000) not_found_url = self.get_api_path('/books/' + str(ObjectId())) body = self.body(data) response = self.client.put(not_found_url, data=body, headers=self.jwt_headers) self.assert404(response) self.assertResponseCode(response, 154041) with patch('eclogue.api.book.AnsibleGalaxy') as mock_build: clone = data.copy() clone['importType'] = 'galaxy' clone['status'] = 0 response = self.client.put(url, data=self.body(clone), headers=self.jwt_headers) params = [data.get('galaxyRepo')] mock_build.assert_called_with(params, {'force': True}) self.assert200(response)
def test_delete_book(self): data = self.get_data('book') playbook = self.get_data('playbook') data['name'] = str(uuid.uuid4()) result = Book.insert_one(data.copy()) book_id = result.inserted_id playbook['book_id'] = str(book_id) Playbook.insert_one(playbook) self.trash += [ [Book, book_id], [Playbook, playbook['_id']], ] url = self.get_api_path('/books/' + str(book_id)) not_found_url = self.get_api_path('/books/' + str(ObjectId())) response = self.client.delete(not_found_url, headers=self.jwt_headers) self.assert404(response) self.assertResponseCode(response, 154041) response = self.client.delete(url, headers=self.jwt_headers) self.assert200(response) record = Book.find_by_id(book_id) self.assertEqual(record, None) record = Book().collection.find_one({'_id': book_id}) self.assertIsNotNone(record) self.assertEqual(record['_id'], book_id) self.assertEqual(record['status'], -1) playbook_record = Playbook().collection.find_one( {'_id': playbook['_id']}) self.assertIsNotNone(playbook_record) self.assertEqual(playbook_record['status'], -1)
def test_edit_file(self): data = self.get_data('book') playbook = self.get_data('playbook') data['name'] = str(uuid.uuid4()) result = Book.insert_one(data.copy()) book_id = result.inserted_id playbook['book_id'] = str(book_id) Playbook.insert_one(playbook) self.trash += [ [Book, book_id], [Playbook, playbook['_id']], ] path = '/playbook/%s/file' url = self.get_api_path(path % str(ObjectId())) response = self.client.put(url, data=self.body({}), headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 154000) url = self.get_api_path(path % str(ObjectId())) params = playbook.copy() params.pop('_id') register_id = str(ObjectId()) update = { 'description': 'big jet plane', 'is_edit': False, 'register': [register_id] } params.update(update) response = self.client.put(url, data=self.body(params), headers=self.jwt_headers) self.assert404(response) url = self.get_api_path(path % str(playbook['_id'])) with patch('eclogue.api.playbook.Configuration') as config_mock: config_mock.find.return_value = None response = self.client.put(url, data=self.body(params), headers=self.jwt_headers) self.assert404(response) self.assertResponseCode(response, 154042) config_mock.find.return_value = {'_id': register_id} with patch('eclogue.api.playbook.Workspace') as wk_mock: response = self.client.put(url, data=self.body(params), headers=self.jwt_headers) self.assert200(response) wk_mock.assert_called() wk_mock.return_value.write_book_file.assert_called()
def test_book_detail(self): data = self.get_data('book') data['name'] = str(uuid.uuid4()) result = Book.insert_one(data) book_id = result.inserted_id self.trash += [ [Book, book_id], ] url = self.get_api_path('/books/' + str(ObjectId())) response = self.client.get(url, headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 154041) url = self.get_api_path('/books/' + str(book_id)) response = self.client.get(url, headers=self.jwt_headers) self.assert200(response)
def test_upload(self): url = self.get_api_path('/books/%s/playbook' % str(ObjectId())) response = self.client.post(url, headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 104004) data = self.get_data('book') data['name'] = str(uuid.uuid4()) result = Book.insert_one(data.copy()) book_id = result.inserted_id self.trash += [ [Book, book_id], ] url = self.get_api_path('/books/%s/playbook' % str(book_id)) response = self.client.post(url, headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 104001) headers = self.jwt_headers.copy() headers.update({'Content-Type': 'multipart/form-data'}) stream = BytesIO(bytes('mock test', 'utf-8')) params = {'file': (stream, 'test.yaml')} response = self.client.post(url, data=params, headers=headers, content_type='multipart/form-data') self.assert200(response) record = Playbook.find_one({'book_id': str(book_id)}) assert record is not None db.fs().delete(record.get('file_id')) with patch('eclogue.api.book.is_edit') as build_mock: build_mock.return_value = False stream = BytesIO(bytes('mock test', 'utf-8')) params = {'file': (stream, 'binary.mock')} response = self.client.post(url, data=params, headers=headers, content_type='multipart/form-data') self.assert200(response) record = Playbook.find_one({ 'book_id': str(book_id), 'file_id': { '$exists': True } }) assert record is not None db.fs().delete(record.get('file_id')) Playbook().collection.delete_many({'book_id': str(book_id)})
def test_add_folder(self): data = self.get_data('book') playbook = self.get_data('playbook') playbook['is_dir'] = True data['name'] = str(uuid.uuid4()) result = Book.insert_one(data.copy()) book_id = result.inserted_id playbook['book_id'] = str(book_id) Playbook.insert_one(playbook) self.trash += [ [Book, book_id], [Playbook, playbook['_id']], ] path = '/playbook/folder' url = self.get_api_path(path) response = self.client.post(url, data=self.body({ 'id': '', 'folder': '' }), headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 104000) params = { 'id': str(ObjectId()), 'folder': 'test', 'parent': playbook['path'], 'book_id': str(book_id), } response = self.client.post(url, data=self.body(params), headers=self.jwt_headers) self.assert400(response) params['id'] = str(playbook['_id']) response = self.client.post(url, data=self.body(params), headers=self.jwt_headers) self.assert200(response) response = self.client.post(url, data=self.body(params), headers=self.jwt_headers) self.assert200(response)
def test_get_playbook(self): book = self.get_data('book') playbook = self.get_data('playbook') result = Book.insert_one(book.copy()) book_id = result.inserted_id playbook['book_id'] = str(book_id) Playbook.insert_one(playbook) self.trash += [[Book, book_id], [Playbook, playbook['_id']]] url = self.get_api_path('/books/%s/playbook' % str(ObjectId())) response = self.client.get(url, headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 154001) Book.update_one({'_id': book_id}, {'$set': {'status': -1}}) url = self.get_api_path('/books/%s/playbook' % str(book_id)) response = self.client.get(url, headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 154001) Book.update_one({'_id': book_id}, {'$set': {'status': 1}}) url = self.get_api_path('/books/%s/playbook' % str(book_id)) response = self.client.get(url, headers=self.jwt_headers) self.assert200(response)
def test_get_playbook(self): data = self.get_data('book') playbook = self.get_data('playbook') data['name'] = str(uuid.uuid4()) result = Book.insert_one(data.copy()) book_id = result.inserted_id playbook['book_id'] = str(book_id) Playbook.insert_one(playbook) self.trash += [ [Book, book_id], [Playbook, playbook['_id']], ] url = self.get_api_path('/books/%s/playbook' % str(ObjectId())) query = {'current': str(playbook['_id'])} response = self.client.get(url, query_string=query, headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 154001) url = self.get_api_path('/books/%s/playbook' % playbook['book_id']) Book.update_one({'_id': book_id}, {'$set': {'status': -1}}) response = self.client.get(url, query_string=query, headers=self.jwt_headers) self.assert400(response) self.assertResponseCode(response, 154001) Book.update_one({'_id': book_id}, {'$set': {'status': 1}}) url = self.get_api_path('/books/%s/playbook' % playbook['book_id']) response = self.client.get(url, query_string=query, headers=self.jwt_headers) self.assert200(response) result = response.json data = result.get('data') check = map(lambda i: str(i['_id']), data) check = list(check) assert str(playbook['_id']) in check
def test_upload(self): data = self.get_data('book') playbook = self.get_data('playbook') data['name'] = str(uuid.uuid4()) result = Book.insert_one(data.copy()) book_id = result.inserted_id playbook['book_id'] = str(book_id) Playbook.insert_one(playbook) self.trash += [ [Book, book_id], [Playbook, playbook['_id']], ] headers = self.jwt_headers.copy() headers.update({'Content-Type': 'multipart/form-data'}) url = self.get_api_path('/playbook/upload') response = self.client.post(url, headers=headers) self.assert400(response) self.assertResponseCode(response, 104000) url = self.get_api_path('/playbook/upload') form = {'parent': '/', 'bookId': str(ObjectId())} response = self.client.post(url, data=form, headers=headers) self.assert400(response) self.assertResponseCode(response, 104001) stream = BytesIO(bytes('mock test', 'utf-8')) form['files'] = (stream, 'test.yaml') response = self.client.post(url, data=form, headers=headers) self.assert404(response) self.assertResponseCode(response, 104040) params = form.copy() stream = BytesIO(bytes('mock test', 'utf-8')) params['files'] = (stream, 'test.yaml') params['parent'] = ObjectId() response = self.client.post(url, data=params, headers=headers, content_type='multipart/form-data') self.assert400(response) self.assertResponseCode(response, 104004) stream = BytesIO(bytes('mock test', 'utf-8')) form['files'] = (stream, 'test.yaml') form['bookId'] = book_id response = self.client.post(url, data=form, headers=headers, content_type='multipart/form-data') self.assert200(response) record = Playbook.find_one({ 'book_id': str(book_id), '_id': { '$ne': playbook['_id'] } }) assert record is not None db.fs().delete(record.get('file_id')) with patch('eclogue.api.playbook.is_edit') as build_mock: build_mock.return_value = False stream = BytesIO(bytes('mock test', 'utf-8')) form['files'] = (stream, 'binary.mock') response = self.client.post(url, data=form, headers=headers, content_type='multipart/form-data') self.assert200(response) record = Playbook.find_one({ 'book_id': str(book_id), 'file_id': { '$exists': True } }) assert record is not None db.fs().delete(record.get('file_id')) Playbook().collection.delete_many({'book_id': str(book_id)})
def add_book(): params = request.get_json() or request.form if not params: return jsonify({ 'message': 'invalid params', 'code': 154000, }), 400 name = params.get('name') if not name: return jsonify({ 'message': 'name param required', 'code': 154001, }), 400 existed = Book.find_one({'name': name}) if existed: return jsonify({ 'message': 'book exist', 'code': 154003, }), 400 description = params.get('description') status = params.get('status', 0) book_id = params.get('_id') import_type = params.get('importType') repo = params.get('repo') maintainer = params.get('maintainer', []) readonly = params.get('readonly', False) if book_id: record = Book.find_by_id(book_id) if not record: return jsonify({ 'message': 'record not found', 'code': 154041, }), 404 else: data = { 'name': name, 'readonly': readonly, 'description': description, 'maintainer': maintainer, 'import_type': import_type, 'repo': repo, 'created_at': int(time.time()) } result = Book.insert_one(data) book_id = result.inserted_id if import_type == 'galaxy' and repo: galaxy = AnsibleGalaxy([repo]) galaxy.install(book_id) logger.info('import galaxy', extra={'repo': repo}) elif import_type == 'git' and repo: git = GitDownload({'repository': repo}) dest = git.install() Workspace().import_book_from_dir(dest, book_id, exclude=['.git']) data = { 'readonly': readonly, 'description': description, 'maintainer': maintainer, 'import_type': import_type, 'repo': repo, 'status': int(status), 'updated_at': time.time(), } Book.update_one({'_id': ObjectId(book_id)}, {'$set': data}, upsert=True) data['_id'] = book_id return jsonify({ 'message': 'ok', 'code': 0, 'data': data, })