def testCustomWebRoot(self):
        # Root (/) should serve our custom route
        resp = self.request('/', prefix='', isJson=False)
        self.assertStatusOk(resp)
        self.assertEqual(self.getBody(resp), 'hello world')

        # Normal web client should now be served from /girder
        resp = self.request('/girder', prefix='', isJson=False)
        self.assertStatusOk(resp)
        self.assertTrue(
            'g-global-info-apiroot' in self.getBody(resp))

        # Api should be served out of /api/v1
        resp = self.request('/api/v1', prefix='', isJson=False)
        self.assertStatusOk(resp)
        self.assertTrue(
            'Girder REST API Documentation' in self.getBody(resp))

        # /api should redirect to /api/v1
        resp = self.request('/api', prefix='', isJson=False)
        self.assertStatus(resp, 303)
        self.assertTrue('/api/v1' in self.getBody(resp))

        # Our custom API augmentations should still work
        resp = self.request('/describe')
        self.assertStatusOk(resp)
        self.assertTrue('apis' in resp.json)
        otherDocs = [x for x in resp.json['apis'] if x['path'] == '/other']
        self.assertEqual(len(otherDocs), 1)

        resp = self.request('/describe/other')
        self.assertStatusOk(resp)
        self.assertEqual(len(resp.json['apis']), 1)

        resp = self.request('/other')
        self.assertStatusOk(resp)
        self.assertEqual(resp.json, ['custom REST route'])

        # Api should not be served out of /girder/api/v1
        resp = self.request('/girder/api/v1', prefix='', isJson=False)
        self.assertStatus(resp, 404)

        # Test our staticFile method
        resp = self.request('/static_route', prefix='', isJson=False)
        self.assertEqual(self.getBody(resp), 'Hello world!\n')
To remove a user from a project group, delete corresponding connection (**url** field). Successful deletion
dataset/ETHPy150Open girder/girder/tests/cases/custom_root_test.py/CustomRootTestCase.testCustomWebRoot--crossover with--dataset/ETHPy150Open opennode/nodeconductor/nodeconductor/structure/views.py/ProjectGroupPermissionViewSet.retrieve