_xowiki__xowiki_json_fields (private)

 _xowiki__xowiki_json_fields

Defined in packages/xowiki/tcl/test/json-test-procs.tcl

Partial Call Graph (max 5 caller/called nodes):
aa_equals aa_equals (public) aa_false aa_false (public) aa_log aa_log (public) aa_log_result aa_log_result (public) aa_true aa_true (public) _xowiki__xowiki_json_fields _xowiki__xowiki_json_fields _xowiki__xowiki_json_fields->aa_equals _xowiki__xowiki_json_fields->aa_false _xowiki__xowiki_json_fields->aa_log _xowiki__xowiki_json_fields->aa_log_result _xowiki__xowiki_json_fields->aa_true

Testcases:
No testcase defined.
Source code:
        
        set _aa_export {}
        set body_count 1
        foreach testcase_body {{
  if {![::acs::icanuse "ns_json"]} {
    aa_log "Skipping JSON export tests: ns_json is unavailable"
    return
  }
  ::xo::library require -package xowiki json-procs
  set objects {}
  try {
    set page [::xowiki::Page new]
    lappend objects $page
    set text [::xowiki::formfield::FormField new -object $page -locale en_US -name text -spec text]
    lappend objects $text
    foreach value [list 00123 false "a\"b\\c\n\t<script>" ""] {
      aa_equals "text stays a string" [$text json_value $value] [list string $value]
      set json [ns_json value -type object [list text {*}[$text json_value $value]]]
      aa_equals "text survives JSON encoding" [dict get [::util::json2dict $json] text] $value
    }
    set flag [::xowiki::formfield::FormField new -object $page -locale en_US -name flag -spec boolean]
    lappend objects $flag
    aa_equals "true boolean" [$flag json_value t] {boolean true}
    aa_equals "false boolean" [$flag json_value f] {boolean false}
    aa_equals "empty boolean becomes null" [$flag json_value ""] {null {}}
    aa_equals "invalid boolean remains text" [$flag json_value invalid] {string invalid}
    set number [::xowiki::formfield::FormField new -object $page -locale en_US -name amount -spec numeric]
    lappend objects $number
    aa_equals "empty numeric becomes null" [$number json_value ""] {null {}}
    aa_equals "numeric zero is retained" [$number json_value 0] {number 0}
    aa_equals "numeric value" [$number json_value 12.5] {number 12.5}
    aa_equals "non-JSON number preserved" [$number json_value NaN] {string NaN}
    set nullable [list amount {*}[$number json_value ""] flag {*}[$flag json_value ""] text {*}[$text json_value ""]]
    aa_equals "typed nulls and empty text encoded distinctly"  [ns_json value -type object $nullable] {{"amount":null,"flag":null,"text":""}}
    $number set keep_string_rep 1
    aa_equals "empty numeric with keep_string_rep becomes null" [$number json_value ""] {null {}}
    aa_equals "localized string preserved" [$number json_value 1,5] {string 1,5}

    set compound [::xowiki::formfield::CompoundField new -object $page -locale en_US -name person]
    lappend objects $compound
    $compound create_components {{label text} {enabled boolean}}
    aa_equals "compound uses component names and types"  [$compound json_value {person.label 00123 person.enabled t person.old retained}]  {object {label string 00123 enabled boolean true old string retained}}
    aa_equals "compound does not inject defaults" [$compound json_value {}] {object {}}
    aa_equals "retyped legacy value preserved" [$compound json_value invalid] {string invalid}

    set scalar_repeat [::xowiki::formfield::FormField new -object $page -locale en_US -name tags -spec "text,repeat=0..5"]
    lappend objects $scalar_repeat
    aa_equals "scalar repeat uses actual occurrence factory"  [$scalar_repeat json_value {tags.0 {} tags.3 third tags.1 first}]  {array {0 string first 1 string third}}
    set compound_class ::xowiki::formfield::json_test_compound
    ::xotcl::Class create $compound_class -superclass ::xowiki::formfield::CompoundField
    lappend objects $compound_class
    $compound_class instproc initialize {} {
      :create_components {{label text} {enabled boolean}}
      next
    }
    set repeat [::xowiki::formfield::FormField new -object $page -locale en_US -name people  -spec "json_test_compound,repeat=0..20"]
    lappend objects $repeat
    aa_equals "repeat skips template, sorts numerically and recurses"  [$repeat json_value {
          people.0 template
          people.10 {people.10.label ten people.10.enabled f}
          people.2 {people.2.label two people.2.enabled t}
        }]  {array {0 object {label string two enabled boolean true} 1 object {label string ten enabled boolean false}}}
    aa_equals "empty repeat" [$repeat json_value {}] {array {}}
    aa_equals "template-only repeat" [$repeat json_value {people.0 template}] {array {}}
    set json [ns_json value -type object [list rows {*}[$repeat json_value {}]]]
    aa_equals "empty array is encoded as array" $json {{"rows":[]}}

    foreach policy {policy1 policy2 policy3 policy5} {
      aa_equals "$policy JSON requires site-wide admin"  [::xowiki::${policy}::Page set require_permission(json)] swa
    }

    foreach name {package_id parent_id creation_user modifying_user} {
      $page set $name 704
      aa_equals "$name uses numeric metadata" [$page json_attribute_type $name] number
    }
    $page set modifying_user ""
    foreach name {absolute_links do_substitutions render_adp} {
      $page set $name 1
      aa_equals "$name is boolean" [$page json_attribute_type $name] boolean
    }
    $page set name 00123
    $page set extra "a\nb"
    $page set __temporary secret
    set data [$page json_data]
    aa_true "all ordinary attributes are exported" [expr {[lsearch -exact $data extra] >= 0}]
    aa_false "transient attributes are omitted" [expr {[lsearch -exact $data __temporary] >= 0}]
    set pretty [$page as_json -pretty true]
    aa_true "pretty JSON has line breaks" [expr {[string first "\n" $pretty] >= 0}]
    aa_equals "pretty and compact JSON contain the same values"  [::util::json2dict $pretty] [::util::json2dict [$page as_json]]
    aa_true "empty optional ID is JSON null"  [string match {*"modifying_user":null*} [$page as_json]]
    aa_equals "page text preserved" [dict get [::util::json2dict [$page as_json]] name] 00123
  } finally {
    foreach object [lreverse $objects] {$object destroy}
  }
}} {
          aa_log "Running testcase body $body_count"
          set ::__aa_test_indent [info level]
          set catch_val [catch $testcase_body msg]
          if {$catch_val != 0 && $catch_val != 2} {
              aa_log_result "fail" "xowiki_json_fields (body $body_count): Error during execution: $msg, stack trace: \n$::errorInfo"
          }
          incr body_count
        }
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: