From 225f6fede2919cac94c9165144a9a1975a64eb77 Mon Sep 17 00:00:00 2001
From: Marten Veldthuis <marten@veldthuis.com>
Date: Thu, 4 Mar 2021 16:25:52 +0100
Subject: [PATCH] Fix that lookup tables were not available to
 DefinitionValidator

---
 lib/quby/compiler/dsl.rb                             |  6 +++---
 lib/quby/compiler/dsl/questionnaire_builder.rb       |  2 +-
 lib/quby/compiler/entities/definition.rb             |  5 +++--
 lib/quby/compiler/instance.rb                        |  2 +-
 lib/quby/compiler/services/definition_validator.rb   |  2 +-
 spec/quby/compiler/dsl/helpers_spec.rb               |  3 ++-
 spec/quby/compiler/dsl/questionnaire_builder_spec.rb |  3 ++-
 .../compiler/services/definition_validator_spec.rb   | 12 ++++++++++++
 8 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/lib/quby/compiler/dsl.rb b/lib/quby/compiler/dsl.rb
index d1177be..2199843 100644
--- a/lib/quby/compiler/dsl.rb
+++ b/lib/quby/compiler/dsl.rb
@@ -10,15 +10,15 @@ module Quby
     module DSL
       def self.build_from_definition(definition)
         Entities::Questionnaire.new(definition.key, last_update: definition.timestamp).tap do |questionnaire|
-          builder = QuestionnaireBuilder.new(questionnaire)
+          builder = QuestionnaireBuilder.new(questionnaire, lookup_tables: definition.lookup_tables)
           builder.instance_eval(definition.sourcecode, definition.path) if definition.sourcecode
           questionnaire.callback_after_dsl_enhance_on_questions
         end
       end
 
-      def self.build(key, sourcecode = nil, path: nil, timestamp: nil, &block)
+      def self.build(key, sourcecode = nil, path: nil, timestamp: nil, lookup_tables: {}, &block)
         Entities::Questionnaire.new(key, last_update: timestamp).tap do |questionnaire|
-          builder = QuestionnaireBuilder.new(questionnaire)
+          builder = QuestionnaireBuilder.new(questionnaire, lookup_tables: lookup_tables)
           builder.instance_eval(sourcecode, path || key) if sourcecode
           builder.instance_eval(&block) if block
           questionnaire.callback_after_dsl_enhance_on_questions
diff --git a/lib/quby/compiler/dsl/questionnaire_builder.rb b/lib/quby/compiler/dsl/questionnaire_builder.rb
index 69bd27a..f18c8f0 100644
--- a/lib/quby/compiler/dsl/questionnaire_builder.rb
+++ b/lib/quby/compiler/dsl/questionnaire_builder.rb
@@ -19,7 +19,7 @@ module Quby
         include StandardizedPanelGenerators
         include Helpers
 
-        def initialize(target_instance, lookup_tables: nil)
+        def initialize(target_instance, lookup_tables:)
           @questionnaire = target_instance
           @lookup_tables = lookup_tables
           @default_question_options = {}
diff --git a/lib/quby/compiler/entities/definition.rb b/lib/quby/compiler/entities/definition.rb
index a096071..f02adde 100644
--- a/lib/quby/compiler/entities/definition.rb
+++ b/lib/quby/compiler/entities/definition.rb
@@ -10,13 +10,14 @@ module Quby
         extend  ActiveModel::Naming
         include ActiveModel::Validations
 
-        attr_accessor :key, :sourcecode, :timestamp, :path
+        attr_accessor :key, :sourcecode, :timestamp, :path, :lookup_tables
 
-        def initialize(key:, path:, sourcecode: "", timestamp: nil)
+        def initialize(key:, path:, sourcecode: "", timestamp: nil, lookup_tables: {})
           @path = path
           @key = key
           @sourcecode = sourcecode
           @timestamp = timestamp
+          @lookup_tables = lookup_tables
         end
 
         validates_with Services::DefinitionValidator
diff --git a/lib/quby/compiler/instance.rb b/lib/quby/compiler/instance.rb
index bd1b9fd..5f724c9 100644
--- a/lib/quby/compiler/instance.rb
+++ b/lib/quby/compiler/instance.rb
@@ -63,7 +63,7 @@ module Quby
       end
 
       def validate(key:, sourcecode:)
-        definition = Entities::Definition.new(key: key, sourcecode: sourcecode, path: "validating '#{key}'")
+        definition = Entities::Definition.new(key: key, sourcecode: sourcecode, path: "validating '#{key}'", lookup_tables: lookup_tables)
         definition.valid?
         definition
       end
diff --git a/lib/quby/compiler/services/definition_validator.rb b/lib/quby/compiler/services/definition_validator.rb
index d3a39e6..6785a6b 100644
--- a/lib/quby/compiler/services/definition_validator.rb
+++ b/lib/quby/compiler/services/definition_validator.rb
@@ -30,7 +30,7 @@ module Quby
         rescue Exception => exception # rubocop:disable Lint/RescueException
           definition.errors.add(:sourcecode, {message: "Questionnaire error: #{definition.key}\n" \
                                                        "#{exception.message}",
-                                              backtrace: exception.backtrace[0..5].join("<br/>")})
+                                              backtrace: exception.backtrace[0..20]})
         end
 
         def validate_fields(questionnaire)
diff --git a/spec/quby/compiler/dsl/helpers_spec.rb b/spec/quby/compiler/dsl/helpers_spec.rb
index cc507e6..32b553e 100644
--- a/spec/quby/compiler/dsl/helpers_spec.rb
+++ b/spec/quby/compiler/dsl/helpers_spec.rb
@@ -5,7 +5,8 @@ require 'spec_helper'
 module Quby::Compiler::DSL
   describe Helpers do
     let(:questionnaire) { Quby::Compiler::Entities::Questionnaire.new("example") }
-    let(:builder) { QuestionnaireBuilder.new(questionnaire) }
+    let(:lookup_tables) { {} }
+    let(:builder) { QuestionnaireBuilder.new(questionnaire, lookup_tables: lookup_tables) }
 
     # this helper has some extra tests to check that helpers are included everywhere
     describe '.image_tag' do
diff --git a/spec/quby/compiler/dsl/questionnaire_builder_spec.rb b/spec/quby/compiler/dsl/questionnaire_builder_spec.rb
index 1501149..03bbc36 100644
--- a/spec/quby/compiler/dsl/questionnaire_builder_spec.rb
+++ b/spec/quby/compiler/dsl/questionnaire_builder_spec.rb
@@ -5,7 +5,8 @@ require 'spec_helper'
 module Quby::Compiler::DSL
   describe QuestionnaireBuilder do
     let(:questionnaire) { Quby::Compiler::Entities::Questionnaire.new("example") }
-    let(:builder) { QuestionnaireBuilder.new(questionnaire) }
+    let(:lookup_tables) { {} }
+    let(:builder) { QuestionnaireBuilder.new(questionnaire, lookup_tables: lookup_tables) }
 
     it 'sets title' do
       dsl { title 'Foo' }
diff --git a/spec/quby/compiler/services/definition_validator_spec.rb b/spec/quby/compiler/services/definition_validator_spec.rb
index 59f9ac2..65309bc 100644
--- a/spec/quby/compiler/services/definition_validator_spec.rb
+++ b/spec/quby/compiler/services/definition_validator_spec.rb
@@ -809,5 +809,17 @@ module Quby::Compiler::Services
         expect(definition.errors.full_messages.first).to include('That tag isn\'t allowed here')
       end
     end
+
+    describe 'when using lookup tables' do
+      it 'can validate an externally referenced table' do
+        definition = Quby::Compiler::Entities::Definition.new(
+          key: 'test', 
+          sourcecode: "title 'foo'; import_lookup_tree 'bar'", 
+          path: 'fake definition test',
+          lookup_tables: {'bar' => ""}
+        )
+        expect(definition.valid?).to be true
+      end
+    end
   end
 end
-- 
GitLab