def test_basic_auth_invalid(self, mock_secret):
        """When authType is Basic, and secret is invalid, get error"""
        expr = ExperimentResource(**er_example)
        metric_resource: MetricResource = expr.status.metrics[0].metricObj
        metric_resource.spec.authType = AuthType.BASIC

        auth, err = get_basic_auth(metric_resource)
        self.assertFalse(mock_secret.called, \
            "attempt to fetch secret when no secret is referenced in metric resource")
        assert auth is None
        assert err is not None

        metric_resource.spec.secret = "invalid"
        mock_secret.return_value = ({}, \
            KeyError("cannot find secret invalid in namespace iter8-system"))
        auth, err = get_basic_auth(metric_resource)
        mock_secret.assert_called_with(metric_resource)
        assert auth is None
        assert err is not None

        mock_secret.return_value = ({"username": "******"}, None)
        auth, err = get_basic_auth(metric_resource)
        mock_secret.assert_called_with(metric_resource)
        assert auth is None
        assert err is not None
    def test_basic_auth(self, mock_secret):
        """When authType is Basic, and secret is valid, get basic auth information"""
        expr = ExperimentResource(**er_example)
        metric_resource: MetricResource = expr.status.metrics[0].metricObj
        metric_resource.spec.authType = AuthType.BASIC
        metric_resource.spec.secret = "valid"
        mock_secret.return_value = ({
            "username": "******",
            "password": "******"
        }, None)
        auth, err = get_basic_auth(metric_resource)
        mock_secret.assert_called_with(metric_resource)
        assert auth == HTTPBasicAuth("me", "t0p-secret")
        assert err is None

        with requests_mock.mock(real_http=True) as req_mock:
            file_path = os.path.join(os.path.dirname(__file__),
                                     'data/prom_responses',
                                     'prometheus_sample_response.json')
            response_json = json.load(open(file_path))
            req_mock.get(metric_resource.spec.urlTemplate, json=response_json)

            version = expr.spec.versionInfo.baseline
            start_time = expr.status.startTime
            value, err = get_metric_value(metric_resource, version, start_time)
            assert err is None
            assert value == float(
                response_json["data"]["result"][0]["value"][1])
    def test_prometheus_basic_auth(self, mock_secret):
        """Test prometheus with no authentication"""
        with requests_mock.mock(real_http=True) as req_mock:
            prometheus_basic_auth = request_count
            metric_info = MetricInfo(**prometheus_basic_auth)
            metric_info.metricObj.spec.params[0].value = \
                "sum(increase(revision_app_request_latencies_count{service_name='${name}',${userfilter}}[${elapsedTime}s])) or on() vector(0)"
            metric_info.metricObj.spec.authType = AuthType.BASIC
            metric_info.metricObj.spec.secret = "myns/promcredentials"
            url = metric_info.metricObj.spec.urlTemplate
            json_response = {
                "status": "success",
                "data": {
                    "resultType": "vector",
                    "result": [{
                        "value": [1556823494.744, "21.7639"]
                    }]
                }
            }
            req_mock.register_uri('GET',
                                  url,
                                  json=json_response,
                                  status_code=200)
            mock_secret.return_value = ({
                "username": "******",
                "password": "******"
            }, None)
            auth, err = get_basic_auth(metric_info.metricObj)
            mock_secret.assert_called_with(metric_info.metricObj)
            assert auth == HTTPBasicAuth("produser", "t0p-secret")
            assert err is None

            expr = ExperimentResource(**er_example)
            version = expr.spec.versionInfo.baseline
            version.variables = [
                NamedValue(name="userfilter", value='usergroup!~"wakanda"')
            ]
            start_time = expr.status.startTime

            # verify params
            params = get_params(metric_info.metricObj, version, start_time)
            logger.info(params)
            groups = re.search('(usergroup!~"wakanda")', params[0]["query"])
            assert groups is not None

            # verify jq expression
            value, err = get_metric_value(metric_info.metricObj, version,
                                          start_time)
            assert err is None
            assert value == 21.7639