Improve mod/distributorapi code coverage 23/100823/1
authorAndrew Gauld <agauld@att.com>
Mon, 27 Jan 2020 16:32:25 +0000 (16:32 +0000)
committerAndrew Gauld <agauld@att.com>
Mon, 27 Jan 2020 16:32:56 +0000 (16:32 +0000)
Change-Id: Ida88e1200ef741c794db1c527e9f9216a1721425
Issue-ID: DCAEGEN2-1860
Signed-off-by: Andrew Gauld <agauld@att.com>
mod/distributorapi/tests/test_api.py [new file with mode: 0644]

diff --git a/mod/distributorapi/tests/test_api.py b/mod/distributorapi/tests/test_api.py
new file mode 100644 (file)
index 0000000..d7f543e
--- /dev/null
@@ -0,0 +1,116 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2020 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+
+from distributor.http import _app as app
+from distributor import config
+import pytest
+import requests
+
+class _resp(object):
+    def __init__(self, code, json = None):
+        self.status_code = code
+        if json is not None:
+            self._json = json
+    
+    def json(self):
+        return self._json
+
+    def raise_for_status(self):
+        if self.status_code < 200 or self.status_code >= 300:
+            raise Exception('Error response {}'.format(self.status_code))
+
+class _req(object):
+    def __init__(self, op, url, resp):
+        self.op = op
+        self.url = url;
+        self.resp = resp
+
+    def check(self, op, url):
+        if op != self.op or url != self.url:
+            return None
+        return self.resp
+
+def _match(answers, op, url):
+    for choice in answers:
+        ret = choice.check(op, url)
+        if ret is not None:
+            return ret
+    message = 'Unexpected request {} {}'.format(op, url)
+    print(message)
+    raise Exception(message)
+
+@pytest.fixture
+def mockrequests(monkeypatch):
+    answers = []
+    def get(url, headers = None):
+        return _match(answers, 'GET', url)
+    
+    def post(url, json, headers = None):
+        return _match(answers, 'POST', url)
+
+    def put(url, json, headers = None):
+        return _match(answers, 'PUT', url)
+
+    def delete(url, headers = None):
+        return _match(answers, 'DELETE', url)
+
+    monkeypatch.setattr(requests, 'get', get)
+    monkeypatch.setattr(requests, 'post', post)
+    monkeypatch.setattr(requests, 'put', put)
+    monkeypatch.setattr(requests, 'delete', delete)
+    return answers
+
+@pytest.fixture
+def client():
+    app.config['TESTING'] = True
+    with app.test_client() as client:
+        yield client
+
+config.init()
+
+def test_api(client, mockrequests):
+    dummyflow = {'link': {'href': 'buckets/link1/flows/flow1'}, 'name': 'flowname'}
+    mockrequests.extend([
+        _req('GET', 'http://nifi-registry:18080/nifi-registry-api/buckets',
+            _resp(200, [{'link': {'href':'buckets/link1'}}])),
+        _req('GET', 'http://nifi-registry:18080/nifi-registry-api/buckets/link1/flows',
+            _resp(200, [dummyflow])),
+       _req('POST', 'http://newtarget1/url/api/graph/main',
+           _resp(200, {'id':'group1'}))
+    ])
+    for rule in app.url_map.iter_rules():
+      print(rule)
+    url = '/distributor/distribution-targets'
+    url2 = url + '/notfound'
+    url3 = url2 + '/process-groups'
+    assert(len(client.get(url).get_json()['distributionTargets']) == 0)
+    assert(client.get(url2).status_code == 404)
+    assert(client.put(url2, json={'name': 'notfound1', 'runtimeApiUrl': 'http://notfound/url'}).status_code == 404)
+    assert(client.delete(url2).status_code == 404)
+    assert(client.post(url3, json={'processGroupId': 'group1'}).status_code == 404)
+    resp = client.post(url, json={'name': 'target1', 'runtimeApiUrl': 'http://target/url'})
+    assert(resp.status_code == 200)
+    print(resp.get_json())
+    url2 = '/distributor/distribution-targets/' + resp.get_json()['id']
+    url3 = url2 + '/process-groups'
+    assert(len(client.get(url).get_json()['distributionTargets']) == 1)
+    assert(client.get(url2).status_code == 200)
+    assert(client.put(url2, json={'name': 'newtarget1', 'runtimeApiUrl': 'http://newtarget1/url'}).status_code == 200)
+    assert(client.post(url3, json={'processGroupId': 'group1'}).status_code == 404)
+    dummyflow['identifier'] = 'group1'
+    assert(client.post(url3, json={'processGroupId': 'group1'}).status_code == 501)
+    assert(client.delete(url2).status_code == 200)
+    assert(client.delete(url2).status_code == 404)