Giter Site home page Giter Site logo

ai-demo-2's Introduction

---

# A typtical Fx project has two components.
  Fxfile.yaml   # Contains job & environment details.
  test-suites   # This directory contains one or more test suite files.


################ Sample Fxfile.yaml ################

  version: '1'

  name: Fx
  environments:
    - name: Default
      baseUrl: http://dev.fxlabs.io/api/v1
      auths:
        - name: Default
          authType: BASIC
          username: user1
          password: user1
  jobs:
    - name: Default
      environment: Default
      tags:
        - V1
      region: fx-default-queue

################ End of Fxfile.yaml ################


################ Sample test-suite -> test-suites/users_create.yml ############

endpoint: /users

description:

type: SUITE

init:
  - data_init1

auth: default

method: POST

headers:
  - 'Content-Type: application/json'
  - 'Accept: application/json'

testCases:
  - id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": "fx", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": "fx", "jobTitle": "Engineer"}'
  # optional name
  -  id: 1
    body: '{"name": "", "username": "u1", "email": "[email protected]", "company": "fx", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": " ", "username": "u1", "email": "[email protected]", "company": "fx", "jobTitle": "Engineer"}'
  # optional company
  -  id: 1
    body: '{"name": "", "username": "u1", "email": "[email protected]", "company": " ", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": " ", "username": "u1", "email": "[email protected]", "company": "", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": " ", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": "", "jobTitle": "Engineer"}'
  # optional jobTitle
  -  id: 1
    body: '{"name": "", "username": "u1", "email": "[email protected]", "company": " ", "jobTitle": ""}'
  -  id: 1
    body: '{"name": " ", "username": "u1", "email": "[email protected]", "company": "", "jobTitle": " "}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": " ", "jobTitle": ""}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": "", "jobTitle": " "}'

assertions:
  - "@StatusCode == 200"
  - "@Response.errors == false"
  - "@Response.data.name == @Request.name"
  - "@Response.data.username ==IgnoreCase @Request.username"
  - "@Response.data.email == @Request.email"
  - "@Response.data.company == @Request.company"
  - "@Response.data.jobTitle == @Request.jobTitle"

cleanup:
  - user_delete

tags:
  - V1
  - DEV3

policies:
  logger: DEBUG
  repeatOnFailure: 0
  repeat: 0
  repeatDelay: 3000
  timeoutSeconds: 5
  initExec: Request
  cleanupExec: Request

########################## End ################################################



######################## Explanation of Fxfile.yaml ###########################
  version: '1'            # fx schema version defaults to '1'.

  # App name
  name: Fx

  # Marketplace injections.
  # Usage - {{@USName | firstname}} inject into json requests
  imports:
    '@USName': FxLabs/Common/US-Names

  # Environments - represents one or more instance of App (e.g. Dev, QE, Stg, Prod etc).
  environments:
    - name: Default     # App environment name (Always should have one 'Default')
      baseUrl: http://localhost:8080/api/v1  # App environment Base URL
      # app access credentials
      auths:
        - name: Default                      # Auth name (Always should have one 'Default')
          # e.g. 1 (BASIC)
          authType: BASIC                    # (e.g. BASIC, BasicAuth, OAuth_2_0 etc)
          username: user1                    # Username or accessKey
          password: user1                    # Password or secretKey
          # e.g. 2 (OAuth 2.0)
        - name: Stg
          authType: OAuth_2_0
          grantType: password                # (e.g. authorization_code, implicit, client_credentials, password)
          username: [email protected]        # Optional - Only applies if grantType == password
          password: password                 # Optional - Only applies if grantType == password
          clientId: gigy                     #
          clientSecret: secret               #
          id: some-id                        # Optional | unique random string
          accessTokenUri: http://<>/token    #
          userAuthorizationUri:              # Optional
          clientAuthenticationScheme: form   # (e.g. form,header,none,query)
          authorizationScheme: form          # (e.g. form,header,none,query)
          scope: read,write
          # e.g. 3 (Vault injection)
        - name: Dev
          authType: BASIC
          username: [email protected]
          password: '{{@Vault.FxLabs/DevMachinePassword}}' # 'FxLabs/DevMachinePassword' is Vault Key (org/key).


  # job profiles
  jobs:                                      # Job - represents the runnable configuration
    - name: Default                          # Job name
      environment: Default                   # environment name from the environments list.
      tags:                                  # tags - filters test-suites by tag.
        - V1
      region: fx-default-queue               # region - represents the Fx Bot region
                                             # check 'Bot Hub' service for available
                                             # regions on the Control-Plane (UI).
      cron: '0 30 * ? * *'                   # Optional cron expression
      issueTracker: FxLabs/Stg-GitHub-Bot    # Launch a issueTracker bot and inject into a job.
                                             # The bot will auto file/close bugs failed tests.

################################ End  #########################################



################ Explanation test-suites/users_create.yml ################


# Note - Order is not important.

# endpoint - represents the API Endpoint. The base-url value comes from the Fxfile
endpoint: /users

description:

# Suite type - SUITE or ABSTRACT
#   ABSTRACT - is not directly excuted but can be injected into other suites 'init' & 'cleanup' sections.
type: SUITE

init:
  - data_init1
  - data_init2


# auth - refers to auth defined in the Fxfile
# If not defined defaults to 'Default' auth.
# If auth is set to 'NONE' then no auth is used when executing requests
auth: default

# method - represents the API http method (GET, PUT, POST, DELETE etc)
method: POST

# headers - represents request headers - when missing these two headers are auto set ('Content-Type: application/json', 'Accept: application/json')
headers:
  - 'Content-Type: application/json'
  - 'Accept: application/json'


# testCases - group one or more api requests.
testCases:
  - id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": "fx", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": "fx", "jobTitle": "Engineer"}'
  # optional name
  -  id: 1
    body: '{"name": "", "username": "u1", "email": "[email protected]", "company": "fx", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": " ", "username": "u1", "email": "[email protected]", "company": "fx", "jobTitle": "Engineer"}'
  # optional company
  -  id: 1
    body: '{"name": "", "username": "u1", "email": "[email protected]", "company": " ", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": " ", "username": "u1", "email": "[email protected]", "company": "", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": " ", "jobTitle": "Engineer"}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": "", "jobTitle": "Engineer"}'
  # optional jobTitle
  -  id: 1
    body: '{"name": "", "username": "u1", "email": "[email protected]", "company": " ", "jobTitle": ""}'
  -  id: 1
    body: '{"name": " ", "username": "u1", "email": "[email protected]", "company": "", "jobTitle": " "}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": " ", "jobTitle": ""}'
  -  id: 1
    body: '{"name": "fn1 ln", "username": "u1", "email": "[email protected]", "company": "", "jobTitle": " "}'

# assertions - One or more assertions.
# All needs to be true for the test-case to pass.
assertions:
  - "@StatusCode == 200"
  - "@Response.errors == false"
  - "@Response.data.name == @Request.name"
  - "@Response.data.username ==IgnoreCase @Request.username"
  - "@Response.data.email == @Request.email"
  - "@Response.data.company == @Request.company"
  - "@Response.data.jobTitle == @Request.jobTitle"

# cleanup - excutes one or more abstract suites per request or per suite.
cleanup:
  - user_delete
  - org_delete

# tags - jobs can filter test-suites based on the tags.
tags:
  - V1
  - DEV3

# Optional policies
policies:
  logger: DEBUG # DEBUG | ERROR
  repeatOnFailure: 0
  repeat: 0
  repeatDelay: 3000
  timeoutSeconds: 5
  initExec: Request # Request | Suite
  cleanupExec: Request # Request | Suite

################ End of Sample test-suit file ################



## 1. Entity - Keywords
  - @Request
  - @StatusCode
  - @ResponseHeaders
  - @Response
  - @NULL
  - @EMPTY
  - @ResponseTime
  - @ResponseSize

## 2. Data-Injection - Keywords
  - @Random
  - @RandomAlphabetic
  - @RandomAlphanumeric
  - @RandomNumeric
  - @Date
  - @RandomUUID
  - @Vault                # Inject values from Vault e.g. {{@Vault.org/key}} {{@Vault.FxLabs/MyPass}}
  - @*                    # Marketplace injections e.g. define the below 'imports' in Fxfile.yaml
                          # imports:
                          #  '@USName': FxLabs/Common/US-Names
                          #  '@USCC': FxLabs/Common/US-CreditCards
                          #
                          #  e.g. usage {{@USName | firstname}} or {{@USName | lastname}}
                          #  e.g. usage {{@USCC | type}} or {{@USCC | no}} {{@USCC | exp}} {{@USCC | cvv}}

## 3. Comparision - Keywords
  - ==
  - ==IgnoreCase
  - !=
  - >
  - <
  - >=
  - <=
  - =~
  - !=~
  - startsWith
  - startsWithIgnoreCase
  - endsWith
  - endsWithIgnoreCase

## 4. Transformation - Keywords
  - trim
  - trimToNull
  - trimToEmpty
  - truncate
  - strip
  - indexOf
  - indexOfIgnoreCase
  - lastIndexOf
  - left
  - right
  - substringBefore
  - substringAfter
  - substringBeforeLast
  - substringAfterLast
  - substringBetween
  - removeStart
  - removeStartIgnoreCase
  - removeEnd
  - removeEndIgnoreCase
  - remove
  - removeIgnoreCase
  - removeAll
  - removeFirst
  - removePattern
  - chomp
  - chop
  - repeat
  - rightPad
  - leftPad
  - upperCase
  - lowerCase
  - capitalize
  - uncapitalize
  - reverse

## 5. JsonPath supported entities
  - @Request
  - @Response


## Data-Injection examples

  # Injects random 6 chars.
  {"name": "fn1 ln", "username": "{{@Random}}"}

  # Injects random 4 chars as prefix.
  {"name": "fn1 ln", "email": "{{@Random | 4}}@fx.local"}

  # Injects random 6 alphabet chars.
  {"name": "fn1 ln", "email": "{{@RandomAlphabetic}}@fx.local"}

  # Injects random 24 alphabet chars.
  {"name": "fn1 ln", "email": "{{@RandomAlphabetic | 24}}@fx.local"}

  # Injects random 6 numeric chars.
  {"name": "fn1 ln", "email": "{{@RandomAlphanumeric}}@fx.local"}

  # Injects random 8 numeric chars.
  {"name": "fn1 ln", "email": "{{@RandomAlphanumeric | 8}}@fx.local"}

  # Injects date.
  {"name": "fn1 ln", "dob": "{{@Date}}"}

  # Inject date in the format
  {"name": "fn1 ln", "dob": "{{@Date | yyMMddHHmmssZ}}"}

  # Injects UUID.
  {"name": "fn1 ln", "id": "{{@RandomUUID}}"}


## JsonPath examples in assertions ##
  "@Response.data.name == @Request.name"
  "@Response.data.email == @Request.email"

## Comparision Keywords examples in assertions ##
  # == (equals)
  "@StatusCode == 200"
  "@Response.data.name == @Request.name"

  # ==IgnoreCase (equals ignore case)
  "@Response.data.email ==IgnoreCase @Request.email"

  # != (not equals)
  "@Response.data.password != @Request.password"
  "@StatusCode != 500"

  # > (greater than)
  "@Response.age > 21"

  # < (less than)
  "@Response.age < 21"

  # >= (greater than or equal)
  "@Response.age >= 21"

  # <= (less than or equal)
  "@Response.age <= 21"

  # =~ (regex)
  # Tells whether or not this string matches the given
  # Regex doc - https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum
  "@Request.email =~ *@gmail.com"

  # !=~ (negate of regex)
  "@Request.email !=~ *@gmail.com"

  # startsWith (starts with)
  "@Request.email startsWith Bob"

  # startsWithIgnoreCase (starts with ignore case)
  "@Request.email startsWithIgnoreCase Bob"

  # endsWith (ends with)
  "@Request.email endsWith gmail.com"

  # endsWithIgnoreCase (ends with ignore case)
  "@Request.email endsWith Gmail.com"


## Entity Injection examples in assertions ##
  # - @NULL
  @Request.name == @NULL

  # - @EMPTY
  @Request.name == @EMPTY

  # - @ResponseTime (milliseconds)
  @ResponseTime <= 1000

  # - @ResponseSize (bytes)
  @ResponseSize <= 1024

## Transformation support examples ##

  # - trim - removes leading and trailing whitespace
  {{@Request.username | trim}}

  # - trimToNull - removes leading and trailing whitespace and may return null
  {{@Request.username | trimToNull}}

  # - trimToEmpty - removes leading and trailing whitespace and may return ''
  {{@Request.username | trimToEmpty}}

  # - truncate - Truncates '1234567890' to '12345'
  {{@Request.username | truncate 5}}

  # - strip
  # - indexOf - Returns the index within seq of the first occurrence
  {{@Request.email | indexOf @}}

  # - indexOfIgnoreCase
  # - lastIndexOf - Returns the index within seq of the last occurrence
  {{@Request.email | lastIndexOf @}}

  # - left - Gets the leftmost len characters of a String.
  {{@Request.email | left 5}}

  # - right - Gets the rightmost len characters of a String.
  {{@Request.email | right 5}}

  # - substringBefore - Gets the substring before the first occurrence of a separator
  {{@Request.email | substringBefore @}}

  # - substringAfter - Gets the substring after the first occurrence of a separator
  {{@Request.email | substringBefore @}}

  # - substringBeforeLast

  # - substringAfterLast

  # - substringBetween

  # - removeStart - Removes a substring only if it is at the beginning of a source string

  # - removeStartIgnoreCase

  # - removeEnd

  # - removeEndIgnoreCase

  # - remove - Removes all occurrences of a substring from within the source string
  {{@Request.username | remove @}}

  # - removeIgnoreCase

  # - removeAll

  # - removeFirst

  # - removePattern

  # - chomp

  # - chop

  # - repeat - Repeat a String repeat times to form a new String
  {{@Request.username | repeat 2}}

  # - rightPad - Right pad a String with spaces
  {{@Request.username | rightPad 10}}

  # - leftPad - Left pad a String with spaces
  {{@Request.username | leftPad 10}}

  # - upperCase - Converts a String to upper case
  {{@Request.username | upperCase}}

  # - lowerCase - Converts a String to lower case
  {{@Request.username | lowerCase}}

  # - capitalize

  # - uncapitalize

  # - reverse - Reverses a String
  {{@Request.username | reverse}}

## Data Injection examples across suites support

  # In assertions
  # Org_Create_Init - refers to the Init script item.
  # Org_Create_Init_Request - refers to the Request json of the init script.
  # Org_Create_Init_Request.name - JsonPath of name attribute on the request.
  # @Response - refers to the Suite test-case response.
  # @Response.org.name - refers to the JsonPath of response.
  - "@Org_Create_Init_Request.name == @Response.org.name"

  # Injection in endpoint attribute of the Suite.
  # With transformations
  # Org_Create_Init - refers to the Init script item.
  # Org_Create_Init_Headers - refers to the response Headers of init script.
  # Org_Create_Init_Headers.location - refers to the location attribute in Headers
  # substringAfterLast / - extracts the value after the last '/' in location attribute
  endpoint: /hotels/{{@Org_Create_Init_Headers.location | substringAfterLast /}}

ai-demo-2's People

Contributors

intesar avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.