tests/testthat/test-mysql_connection.R

### Docker is required to run these tests.
### Read more about docker at https://hub.docker.com/_/mysql

docker_working <-
  tryCatch({
    container_sha <-
      system(
        "docker run -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=admin -e MYSQL_PASSWORD=password -e MYSQL_DATABASE=example -p 3306:3306 -d mysql",
        intern = TRUE
      )

    Sys.sleep(20)

    con <-
      DBI::dbConnect(
        RMySQL::MySQL(),
        host = "127.0.0.1",
        username = "root",
        password = "password",
        dbname = "example",
        port = 3306
      )

    TRUE
  }, error = \(x){
    FALSE
  })

if(docker_working){

  #-------------------------------------------------------------------------------

  test_that(
    "get_schemas retrieves schemas correctly",
    {

      expect_equal(
        get_schemas_mysql(con),
        c("example", "information_schema", "mysql", "performance_schema", "sys")
      )

    }
  )

  test_that(
    "get_tables retrieve tables correctly",
    {

      DBI::dbSendQuery(
        con,
        "SET @@GLOBAL.local_infile = 1;"
      )

      result <- write_table_mysql(
        con,
        schema = "example",
        table_name = "mtcars",
        data = mtcars
      )

      expect_true(
        "mtcars" %in% get_tables_mysql(
          con,
          schema = "example"
        )
      )

    }
  )

  test_that(
    "get_n_rows retrieves the correct number of rows of a table",
    {
      expect_equal(
        get_n_rows_mysql(
          con,
          schema = "example",
          table = "mtcars"
        ) |> as.numeric(),
        nrow(mtcars) |> as.numeric()
      )
    }
  )

  test_that(
    "get_n_rows retrieves the correct number of rows of a query",
    {
      expect_equal(
        get_n_rows_mysql(
          con,
          schema = "example",
          table = "mtcars",
          query = "SELECT * FROM mtcars LIMIT 10"
        ) |> as.numeric(),
        10
      )
    }
  )

  test_that(
    "get_preview returns a view of the dataframe",
    {
      mtcars_wo_rownames <-
        mtcars

      rownames(mtcars_wo_rownames) <-
        NULL

      expect_equal(
        get_preview_mysql(
          con,
          schema = "example",
          table = "mtcars"
        ),
        mtcars_wo_rownames
      )
    }
  )


  test_that(
    "a create table query works correcty",
    {
      n_rows = get_n_rows_mysql(
        con = con,
        schema = "",
        table = "",
        "CREATE TABLE mtcars_2 AS SELECT * FROM mtcars"
      )

      submit_query(
        "CREATE TABLE mtcars_2 AS SELECT * FROM mtcars",
        con = con,
        n_rows = n_rows
      )

      expect_true(
        "mtcars_2" %in% DBI::dbListTables(con)
      )
    }
  )


  test_that(
    "delete_table correctly drops the table",
    {

      expect_equal(
        "Success",
        delete_table_mysql(
          con,
          schema = "example",
          table = "mtcars"
        )
      )

      expect_false(
        "mtcars" %in% get_tables_mysql(con, schema = "example")
      )

    }
  )

  test_that(
    "write_table correctly upload table",
    {

      res <- DBI::dbSendQuery(con, "CREATE SCHEMA example_2")
      DBI::dbClearResult(res)

      write_table_mysql(
        con,
        schema = "example_2",
        table_name = "mtcars",
        data = mtcars
      )

      expect_true(
        "mtcars" %in% get_tables_mysql(con, schema = "example_2")
      )

    }
  )

  test_that(
    "a join query returns the correct number of rows",
    {
      table_1 <-
        data.frame(
          x = c(1, 2, 3),
          y = c("A", "B", "C")
        )

      table_2 <-
        data.frame(
          z = c(4, 5, 6),
          y = c("A", "B", "C")
        )

      write_table_mysql(
        con,
        schema = "example",
        table_name = "table_1",
        data = table_1
      )

      write_table_mysql(
        con,
        schema = "example",
        table_name = "table_2",
        data = table_2
      )

      expect_equal(
        get_n_rows_mysql(
          con = con,
          schema = "",
          table = "",
          query = "SELECT * FROM table_1 INNER JOIN table_2 USING (y)"
        ),
        3
      )
    }
  )

  #-------------------------------------------------------------------------------

  DBI::dbDisconnect(con)

  system(
    glue::glue(
      "docker stop {container_sha}"
    ),
    intern = TRUE
  )

  Sys.sleep(3)

  system(
    glue::glue(
      "docker rm {container_sha}"
    ),
    intern = TRUE
  )

}

Try the octopus package in your browser

Any scripts or data that you put into this service are public.

octopus documentation built on May 29, 2024, 2:46 a.m.