def setUp(self):
     self.api = OpsGenieAPI("fake-api-key")
     self.resource = self.api.get_resource("alert")
class TestAlertResource(unittest.TestCase):
    def setUp(self):
        self.api = OpsGenieAPI("fake-api-key")
        self.resource = self.api.get_resource("alert")

    def test_create(self):
        with responses.RequestsMock() as requests_mock:
            requests_mock.add(
                requests_mock.POST,
                "https://api.opsgenie.com/v1/json/alert",
                body=json.dumps(
                    {
                        "message": "alert created",
                        "status": "successful",
                        "took": 144,
                        "alertId": "3e6cb390-e408-40b5-835b-c4b995a4b4a8",
                        "code": 200,
                    }
                ),
                status=200,
                content_type="application/json",
            )
            test_message = str(uuid.uuid4())
            alert_response = self.resource.create(test_message)
            self.assertEqual(alert_response["status"], "successful")
            self.assertEqual(len(requests_mock.calls), 1)
            alert_request = json.loads(requests_mock.calls[0].request.body)
            check_request_vals = {"message": test_message}
            for request_key, request_value in check_request_vals.items():
                self.assertEqual(alert_request[request_key], request_value)

    def test_create_id_error(self):
        with self.assertRaises(ValueError):
            self.resource.create("foo message", id=str(uuid.uuid4()))

    def test_update(self):
        alert_id = str(uuid.uuid4())
        response_body = json.dumps(
            {"message": "alert created", "code": 200, "status": "successful", "alertId": alert_id, "took": 126}
        )
        with responses.RequestsMock() as requests_mock:
            requests_mock.add(
                requests_mock.POST,
                "https://api.opsgenie.com/v1/json/alert",
                body=response_body,
                status=200,
                content_type="application/json",
            )
            new_message = fauxfactory.gen_string("alphanumeric", random.randint(1, 130))
            update_result = self.resource.update(id=alert_id, message=new_message)
            self.assertEquals(update_result["alertId"], alert_id)
            alert_request = json.loads(requests_mock.calls[0].request.body)
            self.assertEquals(alert_request["id"], alert_id)
            self.assertEquals(alert_request["message"], new_message)

    def test_update_id_error(self):
        with self.assertRaises(ValueError):
            self.resource.update(message="no id specified")

    def test_get(self):
        fake_alert = self.generate_fake_alert()
        alert_id = fake_alert["id"]
        with responses.RequestsMock() as requests_mock:
            requests_mock.add(
                requests_mock.GET,
                "https://api.opsgenie.com/v1/json/alert",
                body=json.dumps(fake_alert),
                status=200,
                content_type="application/json",
            )
            alert_result = self.resource.get(id=alert_id)
            alert_request = requests_mock.calls[0].request
            query_string = urllib.parse.urlparse(alert_request.path_url).query
            request_params = urllib.parse.parse_qs(query_string)
            self.assertEqual(request_params["id"][0], alert_id)
            for alert_key, alert_val in fake_alert.items():
                self.assertEqual(alert_result[alert_key], alert_val)

    def test_get_id_error(self):
        with self.assertRaises(ValueError):
            self.resource.get()

    def test_list(self):
        fake_alerts_list = [self.generate_fake_alert() for x in range(0, random.randint(0, 5))]
        with responses.RequestsMock() as requests_mock:
            requests_mock.add(
                requests_mock.GET,
                "https://api.opsgenie.com/v1/json/alert",
                body=json.dumps({"alerts": fake_alerts_list}),
                status=200,
                content_type="application/json",
            )
            alerts_response = self.api.get_resource("alert").list(status="unacked")
            alerts_request = requests_mock.calls[0].request
            self.assertEqual(len(requests_mock.calls), 1)
            query_string = urllib.parse.urlparse(alerts_request.path_url).query
            request_params = urllib.parse.parse_qs(query_string)
            self.assertEqual(request_params["status"][0], "unacked")
            self.assertEqual(alerts_response, fake_alerts_list)

    def test_list_id_error(self):
        with self.assertRaises(ValueError):
            self.resource.list(id=str(uuid.uuid4()))

    def test_assign(self):
        fake_id = str(uuid.uuid4())
        fake_owner = fauxfactory.gen_string("alphanumeric", random.randint(1, 30))
        with responses.RequestsMock() as requests_mock:
            requests_mock.add(
                requests_mock.POST,
                "https://api.opsgenie.com/v1/json/alert/assign",
                body=json.dumps({"status": "successful", "code": 200}),
                status=200,
                content_type="application/json",
            )
            assign_result = self.resource.assign(fake_owner, alertId=fake_id)
            self.assertEqual(len(requests_mock.calls), 1)
            assign_request = requests_mock.calls[0].request
            request_body = json.loads(assign_request.body)
            self.assertEqual(request_body["alertId"], fake_id)
            self.assertEqual(request_body["owner"], fake_owner)
            self.assertEqual(assign_result["status"], "successful")

    def test_assign_id_error(self):
        with self.assertRaises(ValueError):
            self.resource.assign("not a real owner")

    def test_renotify(self):
        fake_id = str(uuid.uuid4())
        fake_note = fauxfactory.gen_string("alphanumeric", random.randint(1, 30))
        with responses.RequestsMock() as requests_mock:
            requests_mock.add(
                requests_mock.POST,
                "https://api.opsgenie.com/v1/json/alert/renotify",
                body=json.dumps({"status": "successful", "code": 200}),
                status=200,
                content_type="application/json",
            )
            renotify_result = self.resource.renotify(alertId=fake_id, note=fake_note)
            self.assertEqual(len(requests_mock.calls), 1)
            renotify_request = requests_mock.calls[0].request
            request_body = json.loads(renotify_request.body)
            self.assertEqual(request_body["alertId"], fake_id)
            self.assertEqual(request_body["note"], fake_note)
            self.assertEqual(renotify_result["status"], "successful")

    def test_notify_id_error(self):
        with self.assertRaises(ValueError):
            self.resource.renotify(tinyId=1234)

    def test_add_recipient(self):
        fake_id = str(uuid.uuid4())
        fake_recipient = fauxfactory.gen_string("alphanumeric", random.randint(1, 30))
        fake_note = fauxfactory.gen_string("alphanumeric", random.randint(1, 30))
        with responses.RequestsMock() as requests_mock:
            requests_mock.add(
                requests_mock.POST,
                "https://api.opsgenie.com/v1/json/alert/recipient",
                body=json.dumps({"status": "successful", "code": 200}),
                status=200,
                content_type="application/json",
            )
            add_recipient_result = self.resource.add_recipient(fake_recipient, alertId=fake_id, note=fake_note)
            self.assertEqual(len(requests_mock.calls), 1)
            add_recipient_request = requests_mock.calls[0].request
            request_body = json.loads(add_recipient_request.body)
            self.assertEqual(request_body["alertId"], fake_id)
            self.assertEqual(request_body["note"], fake_note)
            self.assertEqual(request_body["recipient"], fake_recipient)
            self.assertEqual(add_recipient_result["status"], "successful")

    def test_add_recipient_id_error(self):
        with self.assertRaises(ValueError):
            self.resource.add_recipient("foo", tinyId=1234)

    def generate_fake_alert(self, **set_values):
        alert = {
            "id": str(uuid.uuid4()),
            # No tinyId because you have no good reason to want that
            "message": fauxfactory.gen_string("alphanumeric", random.randint(1, 130)),
            "alias": fauxfactory.gen_string("alphanumeric", random.randint(1, 30)),
            "description": fauxfactory.gen_string("alphanumeric", random.randint(1, 15000)),
            "recipients": [
                fauxfactory.gen_string("alphanumeric", random.randint(1, 30)) for x in range(0, random.randint(0, 5))
            ],
            # No actions at this time check back later
            "source": fauxfactory.gen_string("alphanumeric", random.randint(1, 30)),
            "tags": ",".join(
                [fauxfactory.gen_string("alphanumeric", random.randint(1, 30)) for x in range(0, random.randint(0, 5))]
            ),
            "details": {
                fauxfactory.gen_string("alphanumeric", random.randint(1, 30)): fauxfactory.gen_string(
                    "alphanumeric", random.randint(1, 30)
                )
                for x in range(0, random.randint(0, 5))
            },
            "entity": fauxfactory.gen_string("alphanumeric", random.randint(1, 30)),
            "user": fauxfactory.gen_string("alphanumeric", random.randint(1, 30)),
            "note": fauxfactory.gen_string("alphanumeric", random.randint(1, 30)),
        }
        for set_key, set_val in set_values.items():
            alert[sey_key] = set_val
        return alert