#
# test-reticulate.R
#
# Copyright (C) 2022 by Posit Software, PBC
#
# Unless you have received this program directly from Posit Software pursuant
# to the terms of a commercial license agreement with Posit Software, then
# this program is licensed to you under the terms of version 3 of the
# GNU Affero General Public License. This program is distributed WITHOUT
# ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
# AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
#
#

context("reticulate")

test_that("RETICULATE_PYTHON environment variable is respected", {
   # save old value and set a dummy value
   oldPython <- Sys.getenv("RETICULATE_PYTHON")
   Sys.setenv(RETICULATE_PYTHON = "/opt/testthat/python")
   on.exit({
      # restore old value
      Sys.setenv(RETICULATE_PYTHON = oldPython)
   }, add = TRUE)

   # perform autodiscovery
   python <- .rs.inferReticulatePython()

   # we expect that since we set a custom value it'll be reflected
   expect_equal(python, Sys.getenv("RETICULATE_PYTHON"))
})

test_that("Python help topics accept only plain dotted names", {

   # legitimate help topics resolve to valid qualified names
   expect_true(.rs.python.isHelpTopicValid("numpy"))
   expect_true(.rs.python.isHelpTopicValid("os.path"))
   expect_true(.rs.python.isHelpTopicValid("pandas.DataFrame"))
   expect_true(.rs.python.isHelpTopicValid("_private.member"))

})

test_that("Python help topics reject code injection payloads", {

   # these would otherwise be evaluated as Python expressions
   expect_false(.rs.python.isHelpTopicValid("open('pwned.txt','w').write('RCE')"))
   expect_false(.rs.python.isHelpTopicValid("__import__('os').system('id')"))
   expect_false(.rs.python.isHelpTopicValid("os.system('id')"))
   expect_false(.rs.python.isHelpTopicValid("numpy.array(1)"))
   expect_false(.rs.python.isHelpTopicValid("a;b"))
   expect_false(.rs.python.isHelpTopicValid("a b"))
   expect_false(.rs.python.isHelpTopicValid("1abc"))
   expect_false(.rs.python.isHelpTopicValid(".leadingdot"))
   expect_false(.rs.python.isHelpTopicValid(""))

})