*** Settings ***
Library       OperatingSystem
Library       RequestsLibrary
Library       json

*** Variables ***
${MESSAGE}    {"ping": "ok"}

#global variables


*** Test Cases ***
SMS Check SMS API Docker Container
    [Documentation]    Checks if SMS docker container is running
    ${rc}    ${output}=    Run and Return RC and Output    docker ps
    Log To Console              *********************
    Log To Console              retrurn_code = ${rc}
    Log To Console              output = ${output}
    Should Be Equal As Integers    ${rc}    0
    Should Contain    ${output}    nexus3.onap.org:10001/onap/aaf/sms

SMS GetStatus
    [Documentation]    Gets Backend Status
    Create Session   SMS            ${SMS_HOSTNAME}:${SMS_PORT}
    &{headers}=      Create Dictionary  Content-Type=application/json  Accept=application/json
    ${resp}=         Get Request        SMS   /v1/sms/quorum/status   headers=${headers}
    Log To Console              *********************
    Log To Console              response = ${resp}
    Log To Console              body = ${resp.text}
    Should Be Equal As Integers    ${resp.status_code}    200

SMS CreateDomain
    [Documentation]    Creates a Secret Domain to hold Secrets
    Create Session   SMS            ${SMS_HOSTNAME}:${SMS_PORT}
    ${data}          Get Binary File    ${CURDIR}${/}data${/}create_domain.json
    &{headers}=      Create Dictionary  Content-Type=application/json  Accept=application/json
    ${resp}=         Post Request        SMS   /v1/sms/domain   data=${data} headers=${headers}
    Log To Console              *********************
    Log To Console              response = ${resp}
    Log To Console              body = ${resp.text}
    Should Be Equal As Integers    ${resp.status_code}    201

SMS CreateSecret
    [Documentation]  Create A Secret within the Domain
    Create Session   SMS            ${SMS_HOSTNAME}:${SMS_PORT}
    ${data}          Get Binary File    ${CURDIR}${/}data${/}create_secret.json
    &{headers}=      Create Dictionary  Content-Type=application/json  Accept=application/json
    ${resp}=         Post Request       SMS   /v1/sms/domain/curltestdomain/secret   data=${data}  headers=${headers}
    Log To Console              *********************
    Log To Console              response = ${resp}
    Log To Console              body = ${resp.text}
    Should Be Equal As Integers    ${resp.status_code}    201

SMS ListSecret
    [Documentation]    Lists all Secret Names within Domain
    Create Session   SMS            ${SMS_HOSTNAME}:${SMS_PORT}
    &{headers}=      Create Dictionary  Content-Type=application/json  Accept=application/json
    ${resp}=         Get Request        SMS   /v1/sms/domain/curltestdomain/secret   headers=${headers}
    Log To Console              *********************
    Log To Console              response = ${resp}
    Log To Console              body = ${resp.text}
    Should Be Equal As Integers    ${resp.status_code}    200

SMS GetSecret
    [Documentation]    Gets a single Secret with Values from Domain
    Create Session   SMS            ${SMS_HOSTNAME}:${SMS_PORT}
    &{headers}=      Create Dictionary  Content-Type=application/json  Accept=application/json
    ${resp}=         Get Request        SMS   /v1/sms/domain/curltestdomain/secret/curltestsecret1   headers=${headers}
    Log To Console              *********************
    Log To Console              response = ${resp}
    Log To Console              body = ${resp.text}
    Should Be Equal As Integers    ${resp.status_code}    200

SMS DeleteSecret
    [Documentation]    Deletes a Secret referenced by Name from Domain
    Create Session   SMS            ${SMS_HOSTNAME}:${SMS_PORT}
    &{headers}=      Create Dictionary  Content-Type=application/json  Accept=application/json
    ${resp}=         Delete Request        SMS   /v1/sms/domain/curltestdomain/secret/curltestsecret1   headers=${headers}
    Log To Console              *********************
    Log To Console              response = ${resp}
    Log To Console              body = ${resp.text}
    Should Be Equal As Integers    ${resp.status_code}    204

SMS DeleteDomain
    [Documentation]    Deletes a Domain referenced by Name
    Create Session   SMS            ${SMS_HOSTNAME}:${SMS_PORT}
    &{headers}=      Create Dictionary  Content-Type=application/json  Accept=application/json
    ${resp}=         Delete Request        SMS   /v1/sms/domain/curltestdomain   headers=${headers}
    Log To Console              *********************
    Log To Console              response = ${resp}
    Log To Console              body = ${resp.text}
    Should Be Equal As Integers    ${resp.status_code}    204

*** Keywords ***
