示例#1
0
 def test_post_edit_entity_invalid_id(self):
     self._create_entity_data("edittype")
     self._check_entity_data_values("edittype")
     # Form post with ID malformed
     f = default_view_form_data(entity_id="!badentity",
                                orig_id="edittype",
                                action="edit")
     u = entitydata_edit_url("edit",
                             "testcoll",
                             "testtype",
                             entity_id="edittype")
     r = self.client.post(u, f)
     self.assertEqual(r.status_code, 200)
     self.assertEqual(r.reason_phrase, "OK")
     self.assertContains(r, "<h3>Problem with entity identifier</h3>")
     # Test context for re-rendered form
     expect_context = default_view_context_data(
         entity_id="!badentity",
         orig_id="edittype",
         action="edit",
         type_ref="_type/testtype",
         type_choices=self.type_ids,
         record_type="/testsite/c/testcoll/d/_type/testtype/")
     self.assertDictionaryMatch(context_bind_fields(r.context),
                                expect_context)
     # Check stored entity is unchanged
     self._check_entity_data_values("edittype")
     return
 def test_dup_field_display(self):
     # Create entity with duplicate fields
     self._create_entity_data("entitydupfield")
     self._check_entity_data_values(
         "entitydupfield", type_id="testtype", update="Entity", 
         comment2="Comment field 2",
         comment3="Comment field 3"
         )
     # Display entity in view with duplicate fields
     u = entitydata_edit_url(
         "edit", "testcoll", "testtype", 
         entity_id="entitydupfield",
         view_id="DupField_view"
         )
     r = self.client.get(u)
     self.assertEqual(r.status_code,   200)
     self.assertEqual(r.reason_phrase, "OK")
     # Check display context
     expect_context = dupfield_view_context_data(
         coll_id="testcoll", type_id="testtype", 
         entity_id="entitydupfield", orig_id=None,
         type_ref="testtype", type_choices=self.type_ids,
         entity_label="Entity testcoll/testtype/entitydupfield",
         entity_descr="Entity coll testcoll, type testtype, entity entitydupfield",
         entity_descr2="Comment field 2",
         entity_descr3="Comment field 3",
         record_type="/testsite/c/testcoll/d/_type/testtype/",
         action="edit", 
         update="Entity",
         continuation_url=""
         )
     self.assertEqual(len(r.context['fields']), 5)
     self.assertDictionaryMatch(context_bind_fields(r.context), expect_context)
示例#3
0
 def test_get_edit(self):
     u = entitydata_edit_url("edit",
                             "testcoll",
                             "testtype",
                             entity_id="entity1")
     r = self.client.get(u + "?continuation_url=/xyzzy/")
     self.assertEqual(r.status_code, 200)
     self.assertEqual(r.reason_phrase, "OK")
     # log.info(r.content)
     self.assertContains(
         r,
         "<title>Entity testcoll/testtype/entity1 - Default record view - Collection testcoll</title>"
     )
     # Test context
     expect_context = default_view_context_data(
         coll_id="testcoll",
         type_id="testtype",
         entity_id="entity1",
         type_ref="testtype",
         type_choices=self.type_ids,
         entity_label="Entity testcoll/testtype/entity1",
         entity_descr="Entity coll testcoll, type testtype, entity entity1",
         action="edit",
         update="Entity",
         continuation_url="/xyzzy/")
     self.assertEqual(len(r.context['fields']), 3)  # 4 fields over 3 rows
     self.assertDictionaryMatch(context_bind_fields(r.context),
                                expect_context)
     return
示例#4
0
 def _check_context_fields(self,
                           response,
                           action="",
                           vocab_id="",
                           orig_vocab_id=None,
                           vocab_label=None,
                           vocab_descr=None,
                           vocab_uri=None,
                           vocab_seealso=[],
                           update="RecordVocab",
                           continuation_url=None):
     expect_context = vocab_view_context_data(
         coll_id="testcoll",
         vocab_id=vocab_id,
         orig_id=orig_vocab_id,
         action=action,
         vocab_label=vocab_label,
         vocab_descr=vocab_descr,
         vocab_uri=vocab_uri,
         vocab_seealso=[{
             "@id": v
         } for v in vocab_seealso],
         update=update,
         continuation_url=continuation_url)
     actual_context = context_bind_fields(response.context)
     self.assertEqual(len(response.context['fields']), 5)
     self.assertDictionaryMatch(actual_context, expect_context)
     return
    def test_RenderRepeatGroup_no_labels(self):
        # Create view with repeat-field and repeat-group
        testview        = self._create_testview()
        Test_repeat_field = self._create_testrepeatfield(
            label_add=None,
            label_delete="")

        # Render view
        u = entitydata_edit_url("new", "testcoll", "testtype", view_id="testview")
        response = self.client.get(u)
        self.assertEqual(response.status_code,   200)
        self.assertEqual(response.reason_phrase, "OK")

        # Check render context
        expect_context = self._create_repeat_group_view_context(
            entity_id="00000001",
            action="new",
            label_add="Add Test_repeat_field",
            label_delete="Remove Test_repeat_field",
            field_value="",
            continuation_url=""
            )
        actual_context = context_bind_fields(response.context)
        self.assertEqual(len(response.context['fields']), 2)
        self.assertDictionaryMatch(actual_context, expect_context)
        return
示例#6
0
 def test_post_new_entity_missing_id(self):
     f = entitydata_form_data(action="new")
     u = entitydata_edit_url("new", "testcoll", "testtype")
     r = self.client.post(u, f)
     self.assertEqual(r.status_code, 200)
     self.assertEqual(r.reason_phrase, "OK")
     self.assertContains(r, "<h3>Problem with entity identifier</h3>")
     # Test context
     expect_context = entitydata_context_data(action="new")
     self.assertDictionaryMatch(context_bind_fields(r.context),
                                expect_context)
     return
示例#7
0
 def test_post_copy_entity_invalid_id(self):
     f = entitydata_form_data(entity_id="!badentity",
                              orig_id="orig_entity_id",
                              action="copy")
     u = entitydata_edit_url("copy",
                             "testcoll",
                             "testtype",
                             entity_id="entity1")
     r = self.client.post(u, f)
     self.assertEqual(r.status_code, 200)
     self.assertEqual(r.reason_phrase, "OK")
     self.assertContains(r, "<h3>Problem with entity identifier</h3>")
     expect_context = entitydata_context_data(entity_id="!badentity",
                                              orig_id="orig_entity_id",
                                              action="copy")
     self.assertDictionaryMatch(context_bind_fields(r.context),
                                expect_context)
     return
示例#8
0
 def test_post_copy_entity_missing_id(self):
     f = default_view_form_data(action="copy",
                                entity_id="",
                                orig_id="entity1")
     u = entitydata_edit_url("copy",
                             "testcoll",
                             "testtype",
                             entity_id="entity1")
     r = self.client.post(u, f)
     self.assertEqual(r.status_code, 200)
     self.assertEqual(r.reason_phrase, "OK")
     self.assertContains(r, "<h3>Problem with entity identifier</h3>")
     expect_context = default_view_context_data(action="copy",
                                                orig_id="entity1",
                                                type_ref="",
                                                type_choices=self.type_ids)
     self.assertDictionaryMatch(context_bind_fields(r.context),
                                expect_context)
     return
示例#9
0
 def test_post_new_entity_missing_id(self):
     f = default_view_form_data(action="new", entity_id="")
     u = entitydata_edit_url("new", "testcoll", "testtype")
     r = self.client.post(u, f)
     self.assertEqual(r.status_code, 200)
     self.assertEqual(r.reason_phrase, "OK")
     self.assertContains(r, "<h3>Problem with entity identifier</h3>")
     # Test context
     expect_context = default_view_context_data(coll_id="testcoll",
                                                type_id="testtype",
                                                entity_id="",
                                                orig_id="orig_entity_id",
                                                type_ref="",
                                                type_choices=self.type_ids,
                                                action="new")
     self.assertEqual(len(r.context['fields']), 3)  # 4 fields over 3 rows
     self.assertDictionaryMatch(context_bind_fields(r.context),
                                expect_context)
     return
示例#10
0
 def test_post_edit_entity_missing_id(self):
     self._create_entity_data("edittype")
     self._check_entity_data_values("edittype")
     # Form post with ID missing
     f = entitydata_form_data(action="edit", update="Updated entity")
     u = entitydata_edit_url("edit",
                             "testcoll",
                             "testtype",
                             entity_id="edittype")
     r = self.client.post(u, f)
     self.assertEqual(r.status_code, 200)
     self.assertEqual(r.reason_phrase, "OK")
     self.assertContains(r, "<h3>Problem with entity identifier</h3>")
     # Test context for re-rendered form
     expect_context = entitydata_context_data(action="edit",
                                              update="Updated entity")
     self.assertDictionaryMatch(context_bind_fields(r.context),
                                expect_context)
     # Check stored entity is unchanged
     self._check_entity_data_values("edittype")
     return
示例#11
0
 def test_get_new(self):
     u = entitydata_edit_url("new", "testcoll", "testtype")
     r = self.client.get(u + "?continuation_url=/xyzzy/")
     self.assertEqual(r.status_code, 200)
     self.assertEqual(r.reason_phrase, "OK")
     # Test context
     expect_context = default_view_context_data(coll_id="testcoll",
                                                type_id="testtype",
                                                entity_id="00000001",
                                                orig_id=None,
                                                type_ref="testtype",
                                                type_choices=self.type_ids,
                                                entity_label="",
                                                entity_descr="",
                                                action="new",
                                                update="Entity",
                                                continuation_url="/xyzzy/")
     self.assertEqual(len(r.context['fields']), 3)  # 4 fields over 3 rows
     self.assertDictionaryMatch(context_bind_fields(r.context),
                                expect_context)
     return
示例#12
0
    def test_Repeat_Ref_Multifield_edit(self):
        self._create_image_multifield_repeat_ref_and_view()

        # Render view of multifield reference
        u = entitydata_edit_url("edit", "testcoll", "ref_type", "Test_rpt_entity", view_id="Test_rptimg_view")
        response = self.client.get(u)
        self.assertEqual(response.status_code,   200)
        self.assertEqual(response.reason_phrase, "OK")

        # Check render context
        expect_context = self._create_rptref_view_context(
            entity_id="Test_rpt_entity",
            action="edit",
            continuation_url=""
            )
        actual_context = context_bind_fields(response.context)
        self.assertEqual(len(response.context['fields']), 2)
        self.assertDictionaryMatch(actual_context, expect_context)

        f0 = context_view_field(response.context, 0, 0)
        f1 = context_view_field(response.context, 1, 0)

        # Test rendered result
        field_vals    = default_fields(
            coll_id="testcoll", type_id="ref_type", entity_id="Test_rpt_entity", 
            view_id="Test_rptimg_view",
            basepath=TestBasePath,
            tooltip1=f0['field_tooltip'],
            )
        formrow1 = """
            <div class="small-12 medium-6 columns" title="%(tooltip1)s">
              <div class="row view-value-row">
                <div class="%(label_classes)s">
                  <span>Id</span>
                </div>
                <div class="%(input_classes)s">
                    <input type="text" size="64" name="entity_id"
                           placeholder="(entity id)"
                           value="%(entity_id)s"/>
                </div>
              </div>
            </div>
            """%field_vals(width=6)
        formrow2a = """
            <div class="group-label small-12 medium-2 columns">
              <span>Repeat image reference</span>
            </div>
            """
        formrow2b = """
            <div class="small-12 medium-10 columns hide-for-small-only">
              <div class="row">
                <div class="small-1 columns">
                  &nbsp;
                </div>
                <div class="small-11 columns">
                  <div class="edit-grouprow col-head row">
                    <div class="%(col_head_classes)s">
                      <span>Image reference</span>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            """%field_vals(width=6)

        tgt_field_vals = default_fields(
            coll_id="testcoll", type_id="img_type", entity_id="Test_img_entity", 
            view_id="Test_rptimg_view",
            repeat_id="Test_rptref_field",
            field_id="Test_refimg_field",
            tooltip3b=f1._field_description['group_field_descs'][0]['field_tooltip_test']
            )
        formrow3a = """
            <div class="small-12 medium-2 columns hide-for-small-only">
              &nbsp;
            </div>
            """%tgt_field_vals(width=6)
        formrow3b = ("""
            <div class="small-12 medium-10 columns">
              <div class="tbody row select-row">
                <div class="small-1 columns checkbox-in-edit-padding">
                  <input type="checkbox" class="select-box right"
                         name="%(repeat_id)s__select_fields"
                         value="0" />
                </div>
                <div class="small-11 columns">
                  <div class="edit-grouprow row">
                    <div class="%(col_item_classes)s" title="%(tooltip3b)s">
                      <div class="row show-for-small-only">
                        <div class="view-label small-12 columns">
                          <span>Image reference</span>
                        </div>
                      </div>
                      <div class="row view-value-col">
                        <div class="view-value small-12 columns">
                        """+
                        render_select_options(
                            "%(repeat_id)s__0__%(field_id)s", 
                            "Image reference",
                            [FieldChoice("%(type_id)s/%(entity_id)s", label="Label %(entity_id)s")],
                            "%(type_id)s/%(entity_id)s"
                            )+
                        """
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            """)%tgt_field_vals(width=6)
        # log.info(r.content)
        self.assertContains(response, formrow1,  html=True)
        self.assertContains(response, formrow2a, html=True)
        self.assertContains(response, formrow2b, html=True)
        self.assertContains(response, formrow3a, html=True)
        self.assertContains(response, formrow3b, html=True)
        return
示例#13
0
    def test_Repeat_Ref_Multifield_view(self):
        self._create_image_multifield_repeat_ref_and_view()

        # Render view of multifield reference
        u = entitydata_edit_url("view", "testcoll", "ref_type", "Test_rpt_entity", view_id="Test_rptimg_view")
        response = self.client.get(u)
        self.assertEqual(response.status_code,   200)
        self.assertEqual(response.reason_phrase, "OK")

        # Check render context
        expect_context = self._create_rptref_view_context(
            entity_id="Test_rpt_entity",
            action="view",
            continuation_url=""
            )
        actual_context = context_bind_fields(response.context)
        self.assertEqual(len(response.context['fields']), 2)
        self.assertDictionaryMatch(actual_context, expect_context)

        # Test rendered result
        field_vals    = default_fields(
            coll_id="testcoll", type_id="ref_type", entity_id="Test_rpt_entity", 
            view_id="Test_rptimg_view",
            basepath=TestBasePath,
            cont_uri_param=""
            )
        cont_uri_param = (
            "?continuation_url=%(basepath)s/c/%(coll_id)s/v/%(view_id)s/%(type_id)s/%(entity_id)s/!view"%
            field_vals()
            )

        field_vals    = default_fields(
            coll_id="testcoll", type_id="ref_type", entity_id="Test_rpt_entity", 
            view_id="Test_rptimg_view",
            basepath=TestBasePath,
            cont_uri_param=cont_uri_param,
            )
        formrow1 = """
            <div class="small-12 medium-6 columns">
              <div class="row view-value-row">
                <div class="%(label_classes)s">
                  <span>Id</span>
                </div>
                <div class="%(input_classes)s">
                  <a href="%(basepath)s/c/%(coll_id)s/d/%(type_id)s/%(entity_id)s/%(cont_uri_param)s">%(entity_id)s</a>
                </div>
              </div>
            </div>
            """%field_vals(width=6)
        formrow2a = """
            <div class="group-label small-12 medium-2 columns">
              <span>Repeat image reference</span>
            </div>
            """
        # Note two group wrappers here: one for repeat and one for multifield ref...
        formrow2b = """
            <div class="small-12 medium-10 columns hide-for-small-only">
              <div class="row">
                <div class="small-12 columns">
                  <div class="view-grouprow col-head row">
                    <div class="view-label col-head small-12 medium-6 columns">
                      <div class="view-grouprow col-head row">
                        <div class="%(col_head_classes)s">
                          <span>View comment field</span>
                        </div>
                        <div class="%(col_head_classes)s">
                          <span>View image field</span>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            """%field_vals(width=6)

        tgt_field_vals = default_fields(
            coll_id="testcoll", type_id="img_type", entity_id="Test_img_entity", 
            view_id="Test_rptimg_view",
            field_id="image_field",
            basepath=TestBasePath,
            ref_image="%s/c/testcoll/d/img_type/Test_img_entity/image_field.jpeg"%(TestBasePath,),
            cont_uri_param=cont_uri_param,
            )
        formrow3a = """
            <div class="small-12 medium-2 columns">
              &nbsp;
            </div>
            """%tgt_field_vals(width=6)
        formrow3b = ("""
            <div class="small-12 medium-10 columns">
              <div class="row select-row">
                <div class="small-12 columns">
                  <div class="view-grouprow row">
                    <div class="small-12 medium-6 columns">
                      <div class="row show-for-small-only">
                        <div class="view-label small-12 columns">
                          <span>Image reference</span>
                        </div>
                      </div>
                      <div class="row view-value-col">
                        <div class="view-value small-12 columns">
                          <div class="view-grouprow row">
                            <div class="%(col_item_classes)s">
                              <div class="row show-for-small-only">
                                <div class="view-label small-12 columns">
                                  <span>View comment field</span>
                                </div>
                              </div>
                              <div class="row view-value-col">
                                <div class="view-value small-12 columns">
                                  <span class="markdown"><p>Description of image</p></span>
                                </div>
                              </div>
                            </div>
                            <div class="%(col_item_classes)s">
                              <div class="row show-for-small-only">
                                <div class="view-label small-12 columns">
                                  <span>View image field</span>
                                </div>
                              </div>
                              <div class="row view-value-col">
                                <div class="view-value small-12 columns">
                                  <a href="%(ref_image)s" target="_blank">
                                    <img src="%(ref_image)s" alt="Image at '%(ref_image)s'" />
                                  </a>
                                </div>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            """)%tgt_field_vals(width=6)
        # log.info(r.content)
        self.assertContains(response, formrow1,  html=True)
        self.assertContains(response, formrow2a, html=True)
        self.assertContains(response, formrow2b, html=True)
        self.assertContains(response, formrow3a, html=True)
        self.assertContains(response, formrow3b, html=True)
        return
示例#14
0
    def test_Ref_Multifield_edit(self):
        self._create_image_multifield_ref_and_view()

        # Render edit view of multifield reference
        u = entitydata_edit_url("edit", "testcoll", "ref_type", "Test_ref_entity", view_id="Test_refimg_view")
        response = self.client.get(u)
        self.assertEqual(response.status_code,   200)
        self.assertEqual(response.reason_phrase, "OK")

        # Check render context
        expect_context = self._create_refimg_view_context(
            entity_id="Test_ref_entity",
            entity_ref="Test_img_entity",
            action="edit",
            continuation_url=""
            )
        actual_context = context_bind_fields(response.context)
        self.assertEqual(len(response.context['fields']), 1)
        self.assertDictionaryMatch(actual_context, expect_context)

        # Test rendered result
        f0 = context_view_field(response.context, 0, 0)
        f1 = context_view_field(response.context, 0, 1)
        field_vals    = default_fields(
            coll_id="testcoll", type_id="ref_type", entity_id="Test_ref_entity", 
            view_id="Test_refimg_view",
            basepath=TestBasePath,
            tooltip1=f0['field_tooltip'],
            )
        formrow1 = """
            <div class="small-12 medium-6 columns" title="%(tooltip1)s">
              <div class="row view-value-row">
                <div class="%(label_classes)s">
                  <span>Id</span>
                </div>
                <div class="%(input_classes)s">
                  <input type="text" size="64" name="entity_id"
                         placeholder="(entity id)"
                         value="%(entity_id)s"/>
                </div>
              </div>
            </div>
            """%field_vals(width=6)

        tgt_field_vals = default_fields(
            coll_id="testcoll", type_id="img_type", entity_id="Test_img_entity",
            view_id="Test_refimg_view",
            field_id="Test_refimg_field",
            basepath=TestBasePath,
            tooltip2=f1['field_tooltip'],
            )
        formrow2 = ("""
            <div class="small-12 medium-6 columns" title="%(tooltip2)s">
              <div class="row view-value-row">
                <div class="%(label_classes)s">
                  <span>Image reference</span>
                </div>
                <div class="%(input_classes)s">
                """+
                render_select_options(
                    "%(field_id)s", 
                    "Image reference",
                    [FieldChoice("%(type_id)s/%(entity_id)s", label="Label %(entity_id)s")],
                    "%(type_id)s/%(entity_id)s"
                    )+
                """
                </div>
              </div>
            </div>
            """)%tgt_field_vals(width=6)
        # log.info(r.content)
        self.assertContains(response, formrow1,  html=True)
        self.assertContains(response, formrow2,  html=True)
        return
示例#15
0
    def test_Ref_Multifield_view(self):
        self._create_image_multifield_ref_and_view()
        # Render view of multifield imageb reference
        u = entitydata_edit_url(
            "view", "testcoll", "ref_type", "Test_ref_entity", 
            view_id="Test_refimg_view"
            )
        response = self.client.get(u)
        self.assertEqual(response.status_code,   200)
        self.assertEqual(response.reason_phrase, "OK")

        # Check render context
        expect_context = self._create_refimg_view_context(
            entity_id="Test_ref_entity",
            entity_ref="Test_img_entity",
            action="view",
            continuation_url=""
            )
        actual_context = context_bind_fields(response.context)
        self.assertEqual(len(response.context['fields']), 1)
        self.assertDictionaryMatch(actual_context, expect_context)

        # Test rendered result
        field_vals = default_fields(
            coll_id="testcoll", type_id="ref_type", entity_id="Test_ref_entity", 
            view_id="Test_refimg_view",
            basepath=TestBasePath,
            cont_uri_param="",
            )
        cont_uri_param = (
            "?continuation_url=%(basepath)s/c/%(coll_id)s/v/%(view_id)s/%(type_id)s/%(entity_id)s/!view"%
            field_vals()
            )

        field_vals = default_fields(
            coll_id="testcoll", type_id="ref_type", entity_id="Test_ref_entity", 
            view_id="Test_refimg_view",
            basepath=TestBasePath,
            cont_uri_param=cont_uri_param,
            )
        formrow1 = """
            <div class="small-12 medium-6 columns">
              <div class="row view-value-row">
                <div class="%(label_classes)s">
                  <span>Id</span>
                </div>
                <div class="%(input_classes)s">
                  <a href="%(basepath)s/c/%(coll_id)s/d/%(type_id)s/%(entity_id)s/%(cont_uri_param)s">%(entity_id)s</a>
                </div>
              </div>
            </div>
            """%field_vals(width=6)

        tgt_field_vals = default_fields(
            coll_id="testcoll", type_id="img_type", entity_id="Test_img_entity", 
            view_id="Test_refimg_view",
            field_id="image_field",
            basepath=TestBasePath,
            ref_image="%s/c/testcoll/d/img_type/Test_img_entity/image_field.jpeg"%(TestBasePath,),
            cont_uri_param=cont_uri_param,
            tooltip2a="",
            tooltip2b="",
            )
        formrow2a = """
            <div class="small-12 medium-6 columns" %(tooltip2a)s>
              <div class="row view-value-row">
                <div class="%(label_classes)s">
                  <span>View comment field</span>
                </div>
                <div class="%(input_classes)s">
                  <span class="markdown"><p>Description of image</p></span>
                </div>
              </div>
            </div>
            """%tgt_field_vals(width=6)
        formrow2b = """
            <div class="small-12 medium-6 columns" %(tooltip2b)s>
              <div class="row view-value-row">
                <div class="%(label_classes)s">
                  <span>View image field</span>
                </div>
                <div class="%(input_classes)s">
                  <a href="%(ref_image)s" target="_blank">
                    <img src="%(ref_image)s"
                         alt="Image at '%(ref_image)s'" />
                  </a>
                </div>
              </div>
            </div>
            """%tgt_field_vals(width=6)
        # log.info(r.content)
        self.assertContains(response, formrow1,  html=True)
        self.assertContains(response, formrow2a, html=True)
        self.assertContains(response, formrow2b, html=True)
        return
示例#16
0
    def test_RenderRepeatGroup(self):
        # Create view with repeat-field and repeat-group
        testview        = self._create_testview()
        testrepeatfield = self._create_testrepeatfield(
            label_add="Add group",
            label_delete="Remove group")

        # Render view
        u = entitydata_edit_url("new", "testcoll", "testtype", view_id="testview")
        response = self.client.get(u)
        self.assertEqual(response.status_code,   200)
        self.assertEqual(response.reason_phrase, "OK")

        # Check render context
        expect_context = self._create_repeat_group_view_context(
            entity_id="00000001",
            action="new",
            label_add="Add group",
            label_delete="Remove group",
            field_value="",
            continuation_url=""
            )
        actual_context = context_bind_fields(response.context)
        self.assertEqual(len(response.context['fields']), 2)
        self.assertDictionaryMatch(actual_context, expect_context)

        # Test rendered result
        f0 = context_view_field(response.context, 0, 0)
        f1 = context_view_field(response.context, 1, 0)
        field_vals = default_fields(
            coll_id="testcoll", type_id="testtype", entity_id="00000001",
            tooltip1=f0['field_tooltip'],
            )
        formrow1 = """
            <div class="small-12 medium-6 columns" title="%(tooltip1)s">
              <div class="row view-value-row">
                <div class="%(label_classes)s">
                  <span>Id</span>
                </div>
                <div class="%(input_classes)s">
                    <input type="text" size="64" name="entity_id" 
                           placeholder="(entity id)" value="00000001"/>
                </div>
              </div>
            </div>
            """%field_vals(width=6)
        formrow2a = """
            <div class="%(group_label_classes)s">
              <span>Test repeat field label</span>
            </div>
            """%field_vals(width=12)
        formrow2b = """
            <div class="%(group_row_head_classes)s">
              <div class="row">
                <div class="small-1 columns">
                  &nbsp;
                </div>
                <div class="small-11 columns">
                  <div class="edit-grouprow col-head row">
                    <div class="%(col_head_classes)s">
                      <span>Comment</span>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            """%field_vals(width=12)
        formrow2c = """
            <div class="%(group_buttons_classes)s">
              <div class="row">
                <div class="small-1 columns">
                  &nbsp;
                </div>
                <div class="small-11 columns">
                  <input type="submit" name="Test_repeat_field__remove" value="Remove group" />
                  <input type="submit" name="Test_repeat_field__add"    value="Add group" />
                  <input type="submit" name="Test_repeat_field__up"     value="Move &#x2b06;" />
                  <input type="submit" name="Test_repeat_field__down"   value="Move &#x2b07;" />
                </div>
              </div>
            </div>
            """%field_vals(width=12)
        # log.info(r.content)
        self.assertContains(response, formrow1,  html=True)
        self.assertContains(response, formrow2a, html=True)
        self.assertContains(response, formrow2b, html=True)
        self.assertContains(response, formrow2c, html=True)
        return