### Create Single Patient
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations.html#type_create
POST http://{{host}}/fhir/Patient
Content-Type: application/json

< smoketestfiles/patient_create.json

> {%
    client.test("Patient created successfully", function() {
        client.assert(response.status === 201, "Response status is not 201");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is Patient", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "Patient", "Expected 'Patient' but received '" + resourceType + "'");
    });
    client.global.set("single_patient_id", response.body.id);
    client.global.set("single_patient_family_name", response.body.name[0].family);
%}

### Search Single Patient
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations.html#type_search
GET http://{{host}}/fhir/Patient?name={{single_patient_family_name}}&_id={{single_patient_id}}

> {%
    client.test("Patient search successful", function() {
        client.assert(response.status === 200, "Response status is not 200");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is Bundle", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "Bundle", "Expected 'Bundle' but received '" + resourceType + "'");
    });
    client.test("Total patients found is 1", function() {
        const totalFound = response.body.total;
        client.assert(totalFound === 1, "Expected '1' match but found '" + totalFound + "'");
    });
   %}

### Delete Patient
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations.html#instance_delete
DELETE http://{{host}}/fhir/Patient/{{single_patient_id}}

> {%
    client.test("Patient deleted successfully", function() {
        client.assert(response.status === 200, "Response status is not 200");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is OperationOutcome", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "OperationOutcome", "Expected 'OperationOutcome' but received '" + resourceType + "'");
    });
%}

### Batch Patient Create
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations.html#system_transaction
POST http://{{host}}/fhir/
Content-Type: application/json

< smoketestfiles/patient_batch_create.json

> {%
    client.test("Bundle transaction completed successfully", function() {
        client.assert(response.status === 200, "Response status is not 200");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is Bundle", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "Bundle", "Expected 'Bundle' but received '" + resourceType + "'");
    });
    client.test("All patient additions successful", function() {
        for (var index = 0; index < response.body.entry.length; index++) {
            client.assert(response.body.entry[index].response.status === "201 Created", "Expected '201 Created' for patient index " + index + " but received '" + response.body.entry[index].response.status + "'");
        }
    });
    const batch_patient_location = response.body.entry[0].response.location;
    const indexOfHistory = batch_patient_location.lastIndexOf("/_history");
    var trimmed_location = batch_patient_location.substring(0, indexOfHistory);
    trimmed_location = trimmed_location.replace("Patient/", "")
    client.global.set("batch_patient_id", trimmed_location);
%}

### Update - Instance
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations.html#instance_update
PUT http://{{host}}/fhir/Patient/{{batch_patient_id}}
Content-Type: application/json

< smoketestfiles/patient_update.json

> {%
    client.test("Bundle transaction completed successfully", function() {
        client.assert(response.status === 200, "Response status is not 200");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is Patient", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "Patient", "Expected 'Patient' but received '" + resourceType + "'");
    });
    client.test("Test last name updated", function() {
        const familyName = response.body.name[0].family;
        client.assert(familyName === "Iantoryes", "Expected updated family name 'Iantoryes' but received '" + familyName + "'");
    });
    client.test("Test version number updated", function() {
        const versionId = response.body.meta.versionId;
        client.assert(versionId === "2", "Expected updated versionId name '2' but received '" + versionId + "'");
    });
%}

### Patch - Instance
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations.html#instance-level-patch
PATCH http://{{host}}/fhir/Patient/{{batch_patient_id}}
Content-Type: application/json-patch+json

< smoketestfiles/patient_patch.json

> {%
    client.test("Patch operation completed successfully", function() {
        client.assert(response.status === 200, "Response status is not 200");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is Patient", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "Patient", "Expected 'Patient' but received '" + resourceType + "'");
    });
    client.test("Test active field patched", function() {
        const active = response.body.active;
        client.assert(active === false, "Expected updated active 'false' but received '" + active + "'");
    });
%}

### History - Server/Type/Instance
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations.html#history
GET http://{{host}}/fhir/Patient/{{batch_patient_id}}/_history

> {%
    client.test("History completed successfully", function() {
        client.assert(response.status === 200, "Response status is not 200");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is Bundle", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "Bundle", "Expected 'Bundle' but received '" + resourceType + "'");
    });
    client.test("Test receive history type", function() {
        const type = response.body.type;
        client.assert(type === "history", "Expected type 'history' but received '" + type + "'");
    });
%}

### Capability Statement
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations.html#system_capabilities
GET http://{{host}}/fhir/metadata

> {%
    client.test("CapabilityStatement fetched successfully", function() {
        client.assert(response.status === 200, "Response status is not 200");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is CapabilityStatement", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "CapabilityStatement", "Expected 'CapabilityStatement' but received '" + resourceType + "'");
    });
%}

### Extended Operations - everything
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations_operations.html
GET http://{{host}}/fhir/Patient/{{batch_patient_id}}/$everything

> {%
    client.test("$everything operation successful", function() {
        client.assert(response.status === 200, "Response status is not 200");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is Bundle", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "Bundle", "Expected 'Bundle' but received '" + resourceType + "'");
    });
%}

### Extended Operations - validate
# https://hapifhir.io/hapi-fhir/docs/server_plain/rest_operations_operations.html
# @timeout 180   # wait up to 2 minutes for the validate response
POST http://{{host}}/fhir/Patient/{{batch_patient_id}}/$validate

> {%
    client.test("$validate operation successful", function() {
        client.assert(response.status === 200, "Response status is not 200");
    });
    client.test("Response content-type is json", function() {
        const type = response.contentType.mimeType;
        client.assert(type === "application/fhir+json", "Expected 'application/fhir+json' but received '" + type + "'");
    });
    client.test("Response resourceType is OperationOutcome", function() {
        const resourceType = response.body.resourceType;
        client.assert(resourceType === "OperationOutcome", "Expected 'OperationOutcome' but received '" + resourceType + "'");
    });
%}
